【问题标题】: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 完成(并且它不接受回调或返回承诺,因此除非您对其进行编辑,否则您不能)。

      【讨论】:

        猜你喜欢
        • 2019-04-07
        • 1970-01-01
        • 2018-10-17
        • 2020-03-07
        • 2015-11-14
        • 1970-01-01
        • 2018-07-26
        • 2023-04-06
        • 1970-01-01
        相关资源
        最近更新 更多