繁体   English   中英

循环内的异步功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM