[英]Async function inside loop
我是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'); });
您的代码中有很多问题:
循环调用asynchloop在n毫秒后调用循环(索引== undefined)。
您正在测试用例是否索引== items.length。 但是,当您在setTimeout内部调用循环时,不会传递任何参数,因此,在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');
});
我希望这很清楚
这些行:
if (index == items.length) return cb();
和
loop(++index);
……被同步调用。 您不希望asynchFunc
完成(并且它不接受回调或返回承诺,因此,除非您对其进行编辑,否则不能这样做)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.