2016-11-23 79 views
2

我似乎无法得到超时和循环一起工作。如果我删除循环它的工作,或者如果我删除超时它将工作。在一起我会得到一个infinit循环,并且它看起来不像超时函数在while循环内部运行。

任何帮助,将不胜感激!

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

那是因为你改变setTimeout的长度将5秒之后被调用,但将土地涨不获取调用为您的代码将永远不会出来循环 – Rajesh

+0

你真的想才达到什么的? – Sandeeproop

+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);

+0

完美!谢谢! –

2

你的代码永远不会让机会运行超时功能。

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

希望这能够澄清您的查询。