我是javascript的新手,并尝试在循环内执行异步函数。 任何人都可以解释为什么循环连续执行后打印“全部完成”这里是我的代码
function asynchFunc(n, loop) {
setTimeout(loop, n);
}
function processItems(items, cb) {
(function loop (index) {
if (index == items.length) return cb();
console.log(items[index]);
asynchFunc(items[index], loop);
loop(++index);
}(0));
}
processItems([1000,2000,3000,4000,5000], function(ret){
console.log('all done');
});
答案 0 :(得分:1)
您的代码中存在许多问题:
循环调用asynchloop在n毫秒后调用循环(索引== undefined)。
你的测试用例是索引== items.length。但是当你在setTimeout中调用loop时,你不传递参数,所以当setTimeout调用循环时,你的测试用例每次都失败(所以递归永远不会结束)。
如果您希望代码正常工作,则需要在asyncFunc函数中传递索引并在循环函数结束时停止调用循环,如下所示:
function asynchFunc(n, loop, index) {
setTimeout(function() { loop(++index); }, n);
}
function processItems(items, cb) {
(function loop (index) {
if (index == items.length) return cb();
console.log(items[index]);
asynchFunc(items[index], loop, index);
}(0));
}
processItems([1000,2000,3000,4000,5000], function(ret){
console.log('all done');
});
我希望这很清楚
答案 1 :(得分:0)
行:
if (index == items.length) return cb();
和
loop(++index);
...同步调用。您不希望asynchFunc
完成(并且它不接受回调或返回承诺,因此除非您编辑它,否则不能)。