Javascript 如何以递归方式使用JS回调?
我有这部分代码不起作用。它假设是树视图的一部分。klassification_ajax的回调应该在函数完成后工作,但是由于while循环的不同迭代中有其他ajax调用,因此它根本不工作。我检查了是否只有一次迭代,它可以工作,因为它不会干扰其他ajax调用,但是当它进入第二次迭代时,它们会同时发生,结果它们都不工作。然后我意识到我应该把这些迭代作为一个嵌套回调来一步一步地工作,但是怎么做呢Javascript 如何以递归方式使用JS回调?,javascript,ajax,asynccallback,event-driven-design,Javascript,Ajax,Asynccallback,Event Driven Design,我有这部分代码不起作用。它假设是树视图的一部分。klassification_ajax的回调应该在函数完成后工作,但是由于while循环的不同迭代中有其他ajax调用,因此它根本不工作。我检查了是否只有一次迭代,它可以工作,因为它不会干扰其他ajax调用,但是当它进入第二次迭代时,它们会同时发生,结果它们都不工作。然后我意识到我应该把这些迭代作为一个嵌套回调来一步一步地工作,但是怎么做呢 var j = 2; while (result['klass-' + j]) {
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++;
}
还有其他方法可以实现它,例如两个不同的函数,一个像队列一样运行“循环”,一个实际发出请求的函数,在成功回调中再次运行队列。它应该是
item
而不是result['klass-'+(j-1)]
insideClosure
,您还需要传入klass\u id
。这很有效。。。是的。。。你救了我的命。谢谢现在我终于明白了如何以最简单的方式处理这个回调地狱。