循环内的异步函数

时间:2016-11-10 08:19:54

标签: javascript node.js function asynchronous callback

我是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');
});

2 个答案:

答案 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完成(并且它不接受回调或返回承诺,因此除非您编辑它,否则不能)。