如何以递归方式使用 JS 回调?

How to use JS callbacks in a recursive way?

我有这部分代码不起作用。它应该成为树视图的一部分。 klassification_ajax 的回调应该在函数完成后起作用,但由于其他 ajax 在 while 循环的不同迭代中调用,它根本不起作用。我检查了如果我只有一次迭代,它会起作用,因为它不会干扰其他 ajax 调用,但是当它进行第二次迭代时,它们会同时发生,结果 none 它们起作用.然后我意识到我应该将这些迭代作为嵌套回调来使其逐步工作,但是怎么做呢?????

    var j = 2;
    while (result['klass-' + j]) {
        klass_id = result['klass-' + j];

        if (handled_klass.indexOf(result['klass-' + (j - 1)]) == -1) {
            handled_klass.push(result['klass-' + (j - 1)]);

            klassification_ajax(result['klass-' + (j - 1)], function () {
                $('#all-klassifikation-' + result['klass-' + (j - 1)]).collapse('show');
                $('#klassifikation-' + klass_id).css("font-weight", "Bold");
            });
        }
        else {
            $('#klassifikation-' + klass_id).css("font-weight", "Bold");
        }
        j++;
    }

使用闭包,在您的函数中创建另一个包含此代码的函数,如下所示。它将在每次迭代时执行。您的问题是 Ajax 是异步的,在循环完成迭代之前不会执行,导致迭代返回的只是最后一个值。

function Closure(item, klass_id){
    klassification_ajax(item, function () {
        $('#all-klassifikation-' + item).collapse('show');
        $('#klassifikation-' + klass_id).css("font-weight", "Bold");
    });
}

然后调用它你会 运行 函数。

var j = 2;

while (result['klass-' + j]) {
    klass_id = result['klass-' + j];

    if (handled_klass.indexOf(result['klass-' + (j - 1)]) == -1) {
        handled_klass.push(result['klass-' + (j - 1)]);

        Closure(result['klass-' + (j - 1)], 'klass-' + j);
    } else {
        $('#klassifikation-' + klass_id).css("font-weight", "Bold");
    }
    j++;
}

您也可以通过其他方式实现它,例如两个不同的函数,其中一个 运行 比 'loop' 更像一个队列,一个实际发出请求并成功的函数再次回调 运行 队列。