在每个循环上完成异步调用,然后转到下一个节点js

时间:2016-04-25 17:27:43

标签: javascript node.js asynchronous

我刚刚面对当前工作中的情况。我想知道在这种情况下可以使用的最佳模式

我的代码是这样的

for(var i =0 ;i < collection.length; i++){
  asynCall( collection[i],function(){....})//doing a asynchronous call
}

我只是想知道做

等功能的最佳模式

我希望一次完成每个异步调用并获取下一条记录,

  • for i = 0执行异步功能,完成它,转到下一个
  • for i = 1执行异步功能,完成它,转到下一个

依此类推,在每次迭代'i'我想完成异步调用,完成后只需要下一条记录

是否有任何方法以这种方式执行功能。或者有没有其他方法可以做到这一点,npm中是否有任何模块可以帮助我

请指导我提供最佳解决方案

2 个答案:

答案 0 :(得分:2)

使用async.js eachSeries

async.eachSeries(collection, function(collectionItem, callback) {
    asynCall(collectionItem, callback);
}, function(err){
    //Handle errors here
});

答案 1 :(得分:0)

最简单的方法是使用管理异步控制流的库,如async.js

您可以使用async.series逐个调用异步函数。

async.series([
  function (callback) {
    asynCall(collection[0], callback);
  },
  function (callback) {
    asynCall(collection[1], callback);
  },
  ...
]);

或者,如果您希望保持简单,可以使用普通的旧递归。

var i = 0;
(function loop() {
  asynCall(collection[i], function () {
    if (++i < collection.length) loop();
  });
}());

如果你真的想在循环中顺序调用异步函数,也可以使用async/await

function wrapInPromise(x) {
  return new Promise(function (resolve) {
    asynCall(x, resolve);
  });
}

var collection = ['a', 'b', 'c'];

async function doAsyncStuff() {
  for (var i = 0; i < collection.length; i += 1) {
    await (wrapInPromise(collection[i]));
  }
}

doAsyncStuff();

但是,您需要some effort才能使其真正发挥作用。