【问题标题】:$timeout inside will loop creates infinite loop$timeout 里面会循环创建无限循环
【发布时间】:2017-04-07 00:12:00
【问题描述】:

我似乎无法让超时和循环一起工作。如果我删除循环它会起作用,或者如果我删除超时它会起作用。我将一起得到一个无限循环,如果它在 while 循环内部,它似乎不会运行超时函数。

任何帮助将不胜感激!

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

【问题讨论】:

  • 那是因为你正在改变 setTimeout 中的长度,它将在 5 秒后被调用,但不会被调用,因为你的代码永远不会退出循环
  • 你真正想要达到什么目标?
  • 我想循环直到列表为空但延迟循环。

标签: javascript angularjs settimeout splice


【解决方案1】:

你应该使用递归来循环。另外,您应该检查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);

【讨论】:

  • 完美!谢谢!
【解决方案2】:

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

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

希望这能澄清您的疑问。

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2015-01-24
    • 2016-03-21
    • 2020-02-24
    • 2016-01-24
    相关资源
    最近更新 更多