$ timeout里面会循环创建无限循环
问题描述:
我似乎无法得到超时和循环一起工作。如果我删除循环它的工作,或者如果我删除超时它将工作。在一起我会得到一个infinit循环,并且它看起来不像超时函数在while循环内部运行。
任何帮助,将不胜感激!
function doTask (list) {
if (list) {
while (list.length > 0) {
(function(list){
$timeout(function() {
list.splice(0, 1);
console.log("timeout...")
}, 5000);
})(list);
}
}
}
答
您应该使用递归循环。此外,你应该检查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
完美!谢谢! –
答
你的代码永远不会让机会运行超时功能。
当doTask被调用时,它会进入堆栈运行。现在在每个循环迭代中,您正在注册一个超时,该任务将在此任务结束时执行。但是你从来没有给出超时运行的机会,因此列表的长度永远不会减少,这就是为什么它永远在运行。
希望这能够澄清您的查询。
那是因为你改变setTimeout的长度将5秒之后被调用,但将土地涨不获取调用为您的代码将永远不会出来循环 – Rajesh
你真的想才达到什么的? – Sandeeproop
我想循环,直到列表为空,但延迟循环。 –