Javascript 尝试使异步代码在for循环内同步运行
我有一个函数Javascript 尝试使异步代码在for循环内同步运行,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有一个函数runSyncForLoop,我希望在循环linkArray时,2秒钟的超时将阻止openEmailPage被连续调用大约30次。我这样做是基于我正在阅读的其他几个stackoverflow帖子,其中一个建议deasync,另一个建议sync。我认为我遇到的问题是ret是异步设置的,所以这并不能解决问题。现在,有一个暂停,然后突然openEmailPage被触发了30次,尽管我预计每次触发之间会有两秒的延迟 function runSyncForLoop(linkArray){
runSyncForLoop
,我希望在循环linkArray
时,2秒钟的超时将阻止openEmailPage
被连续调用大约30次。我这样做是基于我正在阅读的其他几个stackoverflow帖子,其中一个建议deasync
,另一个建议sync
。我认为我遇到的问题是ret
是异步设置的,所以这并不能解决问题。现在,有一个暂停,然后突然openEmailPage
被触发了30次,尽管我预计每次触发之间会有两秒的延迟
function runSyncForLoop(linkArray){
for (i in linkArray) {
var ret = 0 ;
setTimeout(function(){
openEmailPage(linkArray[i])
},2000);
ret="hello";
}
while(ret === 0) {
require('deasync').runLoopOnce();
}
return ret;
}
如果没有deasync/timeout功能,则可能是以下情况:
function runSyncForLoop(linkArray){
for (i in linkArray) {
openEmailPage(linkArray[i])
}
}
我正在试图弄清楚如何在每次调用openEmailPage(linkArray[I])
setTimeout()
之间以两秒的延迟运行此程序,因为它是异步的,所以它所做的只是启动一个计时器,而您的for
循环就一直在运行。因此,您最终设置了30个计时器,这些计时器几乎同时启动
相反,您需要运行函数,将计时器设置为两秒钟,当计时器启动时,再次运行函数。有一种方法可以做到这一点:
function runEmailLoop(linkArray) {
var cntr = 0;
function run() {
if (cntr < linkArray.length) {
openEmailPage(linkArray[cntr]);
++cntr;
setTimeout(run, 2000);
}
}
// run first iteration immediately, then each one two seconds after that
run();
}
啊,那太有道理了!
function runEmailLoop(linkArray) {
var cntr = 0;
function run() {
if (cntr < linkArray.length) {
openEmailPage(linkArray[cntr]);
++cntr;
setTimeout(run, 2000);
}
}
// run first iteration in 2 seconds
setTimeout(run, 2000);
}