繁体   English   中英

while循环内的JavaScript回调不起作用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM