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);
}