2015-07-20 83 views
2

我正在使用Asyncasync.map()綁定我的數據數組與功能和async.waterfall()在該函數中運行一系列的功能,但瀑布不按預期工作。我也試過系列但沒有成功。Async.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 

回答

4

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

由於它的工作原理。 –

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); 
    } 
    }) 
} 
0

我有類似的問題。

router.post('/launch', function(req, res, next){ 
    var usersData = {}, 
     dateJour=moment().format('YYYY-M-D'); 

    async.waterfall([ 
     function(done){ 
      // fetch the global users 
      fetchUsers(usersData,done); 
     }, 
     function(usersData,done){ 
      async.map(usersData, function(userdata, done2){ 
       // fetch other data for each user 
       calcBalance(userdata, done2); 
      },function(err, results){ 
       //console.log(' 1b '+ JSON.stringify(usersData)); 
       done(err,usersData); 
      }); 
     }, 
     function(usersData, done){ 
      async.each(usersData, function(userdata, done2) { 
       //watch the info with the news data 
       console.log(' 2 '+ JSON.stringify(userdata)); 
       //console.log(3); 
      }, done) 
     }, 
    ], 
    function(err, results){ 
     // results will be undefined because we called done() from the above async.each 
     console.log('Fin' + JSON.stringify(results)); 
     res.render('synchros', {launch:'end'}, results); 
    }); // end of async.each 
}); // end of router.post() 

在第二個函數中,我使用了async.map,之後它不調用第3個函數? 謝謝,Mdouke