我想读一个文件,做一些事情,检查动作模式。
如果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;
}
答案 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
。