[英]Javascript callback within a while loop does not work?
我正在尝试在javascript中进行事件驱动的while循环。 本质上,它会迭代一个值数组,并在每次迭代期间进行查询。 然后,根据查询结果,它应该继续循环或停止并执行某些操作。
我意识到你不能在while循环中有回调,所以我对如何实现这样的事情感到困惑。 嵌套函数会重复出现,这并不理想。
我的循环代码:
var done = false;
while(!done){
bridgeCheckRooms(send,function(reply){ //callback
console.log(tagArray[count]);
console.log(reply);
if(reply.success){
done = true;
} else {
count--;
}
});
}
您应该使用递归。 一种方法是这样的:
function next() {
// ....
bridgeCheckRooms(send,function(reply){ //callback
console.log(tagArray[count]);
console.log(reply);
if(reply.success){
// continue() ?
// done = true;
} else {
count--;
next();
}
});
}
next();
当然,这只是一个例子。 您应该使它适应您的整个代码。
如果bridgeCheckRooms是同步的并且阻塞了执行线程,直到返回响应,您的代码将是正确的。 看到这篇关于同步性的帖子
这是您的代码中正在发生的事情:
while循环中的代码块正在执行bridgeCheckRooms
,我们假设它将做一些工作,然后将对数据库的异步调用排队。 然后, bridgeCheckRooms
将返回,并且while循环的执行将立即继续,并将另一个对bridgeCheckRooms
调用bridgeCheckRooms
。
他们的关键是bridgeCheckRooms
是一个异步函数,并且直到完成后才阻止执行。 因此,当您调用bridgeCheckRooms时,它只是将一个异步调用排队,但是不会等到完成。
因此,如果while循环执行10次,您将有10个对数据库的待处理请求。 但是,直到while循环停止执行并让异步队列执行后,这些请求才开始执行。
@pablo为此具有正确的代码方法。 他的代码和您的代码之间的区别在于,在第一个异步调用完成之前,不会进行第二个异步调用。
编辑: CallbackHell.com看起来像是关于这个主题的很棒的入门
我认为您想研究延迟的对象和承诺。 您要等到异步调用完成后再进行检查,以查看是否需要继续循环。
或者,如果此处对异步没有好处,则可以使其成为同步调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.