$timeout inside will loop 创建无限循环
$timeout inside will loop creates infinite loop
我似乎无法让超时和循环一起工作。如果我删除循环它会工作,或者如果我删除超时它会工作。我将一起得到一个无限循环,如果超时函数在 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);
您的代码从未给 运行 超时函数提供机会。
调用 doTask 时,它进入堆栈 运行ning。现在在每个循环迭代中,您都在注册一个超时,该超时将在此 doTask 完成时执行。但是您从来没有给 运行 超时的机会,因此列表的长度从未减少,这就是为什么它永远 运行ning 的原因。
希望这能澄清您的疑问。
我似乎无法让超时和循环一起工作。如果我删除循环它会工作,或者如果我删除超时它会工作。我将一起得到一个无限循环,如果超时函数在 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);
您的代码从未给 运行 超时函数提供机会。
调用 doTask 时,它进入堆栈 运行ning。现在在每个循环迭代中,您都在注册一个超时,该超时将在此 doTask 完成时执行。但是您从来没有给 运行 超时的机会,因此列表的长度从未减少,这就是为什么它永远 运行ning 的原因。
希望这能澄清您的疑问。