我试图在javascript中循环播放事件。本质上,它遍历值数组并在每次迭代期间进行查询。然后,根据查询结果,它应该保持循环或停止并执行某些操作。
我意识到你不能在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--;
}
});
}
答案 0 :(得分:2)
你应该使用递归。解决这个问题的方法是这样的:
function next() {
// ....
bridgeCheckRooms(send,function(reply){ //callback
console.log(tagArray[count]);
console.log(reply);
if(reply.success){
// continue() ?
// done = true;
} else {
count--;
next();
}
});
}
next();
当然这只是一个例子。你应该让它适应你的整个代码。
答案 1 :(得分:1)
如果bridgeCheckRooms是 synchronous ,则代码将是正确的,并阻止执行线程,直到返回响应。见SO post on synchronicity
以下是您的代码中发生的事情:
while循环中的代码块正在执行>>> strin = 'thixs ixs xan XArbitrarxy Stxrxing'
>>> xcnt = strin.count('x')
>>> result = ''.join(i for i in strin if i != 'x')
>>> result = result + ('x' * xcnt)
>>> print result
this is an XArbitrary Stringxxxxxx
,我们假设它有一些工作,然后将异步调用排队到数据库。然后bridgeCheckRooms
将返回,并且while循环的执行将立即继续,并将另一个调用排队到bridgeCheckRooms
。
它们的关键部分是bridgeCheckRooms
是一个异步函数,并且在完成之前不会阻止执行。因此,当您调用bridgeCheckRooms时,它只是将异步调用排队,但不会等到它完成。
因此,如果您的while循环执行10次,您将有10个挂起请求到数据库。但是这些请求将不会执行,直到while循环停止执行并产生执行异步队列才能执行。
@pablo有正确的代码方法。他的代码和代码之间的区别在于,在第一次异步调用完成之前,不会进行第二次异步调用。
编辑:CallbackHell.com看起来像是关于此主题的精彩入门
答案 2 :(得分:0)
我认为你想要研究延迟对象和承诺。您希望等到异步调用完成后才能检查是否需要继续循环。
如果这里的异步没有任何好处,你可以把它作为同步通话。