试图让异步代码在for循环中同步运行

时间:2014-10-15 18:04:33

标签: javascript node.js asynchronous

我有一个函数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])

之间延迟两秒来运行此操作

1 个答案:

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