Async.map 和 async.waterfall 没有按预期一起工作

Async.map and async.waterfall not working together as expected

我正在使用 Asyncasync.map() 将我的数据数组与函数绑定,并将该函数中的 async.waterfall() 绑定到系列中的 运行 函数,但瀑布未按预期工作。我也试过系列但没有成功。

var myData = [1,2,3];
async.map(myData, myExport, function (err, result) {
  if(!err) {
    console.log('Finished: ' + result);
    } else {
    console.log('Error: ' + err);
}});

function myExport(item, callback) {
  console.log('item Value: ', item );
  async.waterfall([function(cb){
    console.log(' -> exportData: ', item);

  },function(response,cb){
    console.log(' -> saveData: ', item);
  },
  function(response,cb){
    console.log(' -> updateData: ', item);
  }], function(err,result){
    if(!err) {
      console.log('Perfect: ',result);
    } else {
      console.log('Error: ',err);
    }
  })
}

输出:

item Value:  1
 -> exportData:  1
item Value:  2
 -> exportData:  2
item Value:  3
 -> exportData:  3

要求输出:

item Value:  1
 -> exportData:  1
 -> saveData:    1
 -> updateData:  1
item Value:  2
 -> exportData:  2
 -> saveData:    2
 -> updateData:  2
item Value:  3
 -> exportData:  3
 -> saveData:    3
 -> updateData:  3

您必须调用传递给 waterfall 函数的回调才能在您完成时通知它,例如:

function myExport(item, callback) {
  console.log('item Value: ', item );
  async.waterfall([function(cb){
    console.log(' -> exportData: ', item);
    cb(null, item);
  }, function(response,cb){
    console.log(' -> saveData: ', response);
    cb(null, response);
  }, function(response,cb){
    console.log(' -> updateData: ', response);
    cb(null, response);
  }], function(err,result){
    if(!err) {
      console.log('Perfect: ',result);
    } else {
      console.log('Error: ',err);
    }
  })
}

使用 async 时,请务必调用您的回调!在您的瀑布方法中,确保调用 cb(null, item) 以便瀑布知道您何时继续。在您的映射函数 myExport 中,务必在瀑布结束时调用 callback

工作代码:

    var async = require('async');

    var myData = [1,2,3];
    async.mapSeries(myData, myExport, function (err, result) {
      if(!err) {
        console.log('Finished: ' + result);
        } else {
        console.log('Error: ' + err);
    }});

    function myExport(item, callback) {
      console.log('item Value: ', item );
      async.waterfall([function(cb){
        console.log(' -> exportData: ', item);
          cb(null, item);

      },function(response,cb){
        console.log(' -> saveData: ', item);

          cb(null, item);
      },
      function(response,cb){
        console.log(' -> updateData: ', item);

          cb(null, item);
      }], function(err,result){
        if(!err) {
          console.log('Perfect: ',result);
        } else {
          console.log('Error: ',err);
        }
          callback( err, result);
      })
    }

输出:

    chimmelb:~/Documents/workspace/scratch$ node index.js 
    item Value:  1
     -> exportData:  1
     -> saveData:  1
     -> updateData:  1
    Perfect:  1
    item Value:  2
     -> exportData:  2
     -> saveData:  2
     -> updateData:  2
    Perfect:  2
    item Value:  3
     -> exportData:  3
     -> saveData:  3
     -> updateData:  3
    Perfect:  3
    Finished: 1,2,3