【问题标题】:Async function inside loop循环内的异步函数
【发布时间】:2016-11-10 08:19:53
【问题描述】:
我是 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');
});
【问题讨论】:
标签:
javascript
node.js
function
asynchronous
callback
【解决方案1】:
你的代码有很多问题:
循环调用 asynchloop,在 n 毫秒后调用循环(索引 == 未定义)。
您的测试用例是 if index == 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');
});
我希望这很清楚
【解决方案2】:
线条:
if (index == items.length) return cb();
和
loop(++index);
… 被同步调用。您不希望 asynchFunc 完成(并且它不接受回调或返回承诺,因此除非您对其进行编辑,否则您不能)。