$ timeout inside循环会创建无限循环

时间:2016-11-23 05:33:13

标签: javascript angularjs settimeout splice

我似乎无法让超时和循环一起工作。如果我删除循环它可以工作或如果我删除超时它将工作。我将一起得到一个无限循环,并且看起来似乎超时函数在其内部的while循环中运行。

任何帮助将不胜感激!

function doTask (list) {
    if (list) {
        while (list.length > 0) {  
            (function(list){
                $timeout(function() {   
                   list.splice(0, 1); 
                   console.log("timeout...") 
                }, 5000); 
            })(list); 
        }
    }
}

2 个答案:

答案 0 :(得分:4)

你应该使用递归来循环。此外,您应该检查list.length,因为[]是真实值。

function doTask(list) {
  if (list.length) {
    setTimeout(function() {
      list.splice(0, 1);
      console.log("timeout...")
      doTask(list);
    }, 500);
  }
}
var list = [1,2,3,4,5]
doTask(list);

答案 1 :(得分:2)

您的代码永远不会有机会运行超时功能。

当调用doTask时,它会进入堆栈运行。现在,在每次循环迭代中,您将注册一个超时,该超时将在此doTask完成时执行。但是你从来没有机会超时运行,因此列表的长度从未减少,这就是它永远运行的原因。

希望这能澄清您的疑问。