nodejs-async:如何在“async.series”功能块中使用包含异步调用的循环

时间:2018-01-09 10:47:53

标签: javascript node.js async.js

在使用基于async.series的设计时,我必须在功能块中使用循环,如下所示:

var someFile = filePath;
async.series([
    function(cb) {
         _.forEach (
               someDataList,
               function (item) {
                   //call that executes out of sync
                   writeToFile(someFile,item)
                   //how to provide callback here
                   cb(); //<- is this correct - won't this take control out of this block in the very first loop iteration?
               }
         );
    }
],
//callback function
function (err) {...}
);

2 个答案:

答案 0 :(得分:2)

要了解有关异步的更多信息,您可以使用他们的方法each

  

将函数iteratee并行应用于coll中的每个项目。该   使用列表中的项目调用iteratee,并使用when的回调   它已经完成了。如果iteratee将错误传递给它的回调,那么   主要回调(对于每个函数)立即调用   错误。

您的代码可以转换为:

var someFile = filePath;
async.series([
    function (cb) {
      async.each(someDataList, function (item, callback) {
        //call that executes out of sync
        writeToFile(someFile,item)

        // Execute internal callback for `async.each`
        callback()
      }, function (error) {
        if (error) {
          cb(error)
        } else {
          cb()
        }
      })
    }
  ],
//callback function
  function (err) {...
  }
);

但是,当然,你需要看看你的writeToFile功能。 如果是sync,则需要将其包含在try {} catch(e){}构造中,并在catch部分中运行错误callback()的内部callback(error)

答案 1 :(得分:2)

您可以改为使用forEachSeries。

var someFile = filePath;
async.forEachSeries(someDataList, function(item, cb) {
   writeToFile(someFile, item)
   cb();
},
//callback function
function () {...}
);

评论后更新:

不幸的是,无法在forEachSeries中获取iteratee的索引。如果你想要iteratee的索引,你可以使用eachOfSeries

var someFile = filePath;
async.eachOfSeries(someDataList, function(value, key, callback) {
    //Do something with key
    writeToFile(someFile, item)
    callback();
}, //callback function
function () {...}
);