我有一个函数runSyncForLoop
,其中我希望2秒超时会阻止openEmailPage
连续调用约30次,因为linkArray
已循环播放。我是基于我正在阅读的其他一些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])
答案 0 :(得分:2)
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();
}
如果您希望第一次拨打openEmailPage()
也要等两秒钟,您可以这样更改:
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);
}