【问题标题】:Async.map and async.waterfall not working together as expectedAsync.map 和 async.waterfall 没有按预期一起工作
【发布时间】:2015-10-09 14:04:36
【问题描述】:

我正在使用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

【问题讨论】:

    标签: javascript node.js async.js


    【解决方案1】:

    使用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
    

    【讨论】:

      【解决方案2】:

      您必须调用传递给您的 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);
          }
        })
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-23
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 2016-08-13
        • 2013-07-07
        • 2012-12-05
        • 2017-05-22
        • 2019-07-28
        相关资源
        最近更新 更多