javascript - 循环中的多个settimeouts

时间:2012-02-02 17:21:12

标签: javascript settimeout

我想读一个文件,做一些事情,检查动作模式。

如果mode = STOP,则延迟处理直到模式!= STOP,否则重复整个过程。

我希望它能一直延迟到模式改变为止。

以下代码导致无限循环&浏览器崩溃:

function fnIterateGeocode(addressVariations) {

    // read a file & do some stuff  

    // check for delay
    fnDelay();

   // if not end of file then Iterate
   if (nextRecord.EOF != 'Y') {
        setTimeout(function(){                      
            fnIterateGeocode(addressVariations);                        
        }
        , 5000);
    }


    // if mode = STOP, then delay for 5 seconds and check again     

    function fnDelay(){
        if(mode == 'STOP'){
                setTimeout(function(){                                                      
                }
                , 5000);
                fnDelay();
        }
        return;
    }           

    return;
}

2 个答案:

答案 0 :(得分:2)

您已将电话放回fnDelay错误的地方:

function fnDelay(){
    if(mode == 'STOP'){
            setTimeout(function(){
                // It should be here
            }
            , 5000);
            fnDelay(); // Not here
    }
    return;
}

当前编写代码的方式确实是一个无限循环(好吧,如果你没有用尽堆栈空间),因为fnDelay总是立即调用它自己。

答案 1 :(得分:0)

我认为你并不完全理解异步代码。

无法以您尝试的方式“延迟”javascript(例如wait或其他语言中的sleep)。对setTimeout的调用不会在该点停止执行5秒钟。

尝试将setTimeout视为将传入的函数放入队列以在将来某个时刻调用的请求。完成后,脚本将立即进入下一行代码,与任何其他函数调用一样。

在您的示例中,以下内容更有意义:

function fnDelay(){
    if(mode != 'STOP'){ fnIterateGeocode(); }
    else { setTimeout(fnDelay,5000);
}

只要mode == 'STOP',它就会每5秒调用一次,只要它不会,它就会调用fnIterateGeocode