Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
while循环中的Javascript回调不起作用?_Javascript_Asynchronous_While Loop_Callback_Iteration - Fatal编程技术网

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

while循环中的Javascript回调不起作用?,javascript,asynchronous,while-loop,callback,iteration,Javascript,Asynchronous,While Loop,Callback,Iteration,我试图在javascript中创建一个事件驱动的while循环。本质上,它遍历一个值数组,并在每次迭代期间进行查询。然后,根据查询结果,它应该继续循环,或者停止并做一些事情 我意识到在while循环中不可能有回调,所以我对如何实现这样的事情感到困惑。嵌套函数会重复它们自己,这并不理想 我的循环代码: var done = false; while(!done){ bridgeCheckRooms(send,fun

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

当然,这只是一个例子。您应该使其适应整个代码。

您应该使用递归。实现这一目标的方法如下:

     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时,它只是将一个异步调用排队,但不会等到它完成

因此,如果while循环执行10次,则将有10个对数据库的挂起请求。但是,在while循环停止执行并产生异步队列执行的执行之前,这些请求不会得到执行

@pablo对此有正确的编码方法。他的代码和您的代码之间的区别在于,在第一个异步调用完成之前,不会进行第二个异步调用


编辑:看起来像是这个主题的一个很好的入门读物

如果bridgeCheckRooms是同步的,并且在返回响应之前阻塞了执行线程,那么您的代码将是正确的。看到这个了吗

下面是代码中发生的情况:

while循环中的代码块正在执行
bridgeCheckRooms
,我们将假定它执行了一些工作,然后将对数据库的异步调用排队
bridgeCheckRooms
将返回,while循环将立即继续执行,并排队等待对
bridgeCheckRooms
的另一个调用

关键的一点是,
bridgeCheckRooms
是一个异步函数,在完成之前不会阻止执行。因此,当您调用bridgeCheckRooms时,它只是将一个异步调用排队,但不会等到它完成

因此,如果while循环执行10次,则将有10个对数据库的挂起请求。但是,在while循环停止执行并产生异步队列执行的执行之前,这些请求不会得到执行

@pablo对此有正确的编码方法。他的代码和您的代码之间的区别在于,在第一个异步调用完成之前,不会进行第二个异步调用



编辑:看起来是这个主题的一个很好的入门读物

当你“未完成”时,你应该再次调用自己,而不是有一个循环,换句话说,您需要查看递归bridgeCheckRooms是否进行异步调用?我这样做了,但函数最终会多次复制自身,即使
done==true
,因此它的运行次数比我需要的次数要多。是的,bridgeCheckRooms函数确实对数据库进行异步调用以获取值@Learning2Code当你“还没有完成”时,你应该再次调用自己,而不是有一个循环,换句话说,您需要查看递归bridgeCheckRooms是否进行异步调用?我这样做了,但函数最终会多次复制自身,即使
done==true
,因此它的运行次数比我需要的次数要多。是的,bridgeCheckRooms函数确实对数据库进行异步调用以获取值@Learning2Code作为注释会更好,除非您添加一些代码来支持您的断言,即承诺在浏览器中是有用的,同步网络请求在主线程上是不推荐的,因此,如果这是浏览器代码(没有迹象表明不是),这是一个糟糕的建议,作为注释会更好,除非您添加一些代码来支持您的断言,即承诺在浏览器中是有用的,否则同步网络请求在主线程上是不推荐的,因此,如果这是浏览器代码(没有迹象表明不是),这是一个糟糕的建议。我之前也在做同样的事情,但当它最终完成时,仍在调用该函数。当控制台进入成功块,但
done
被多次记录时,我会记录
done
。我假设函数在完成后仍被调用。调用该函数的唯一原因是如果
reply.success
为false-继续完成日志记录的唯一方法是
bridgeCheckRooms
多次调用对
bridgeCheckRooms
的回调-请解释一下
bridgeCheckRooms
以及该函数如何使用回调。bridge函数发出一条socket消息,将该房间发送到