while循环中的Javascript回调不起作用?

时间:2016-12-16 00:07:08

标签: javascript asynchronous while-loop callback iteration

我试图在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--;
                    }
                });
            }

3 个答案:

答案 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)

我认为你想要研究延迟对象和承诺。您希望等到异步调用完成后才能检查是否需要继续循环。

如果这里的异步没有任何好处,你可以把它作为同步通话。