在瀑布内节点asynchronous并行

我在Nodejs中构build一个服务器来从某个数据库检索数据。 我已经使用了asynchronous库了一段时间了,并想出了一些东西,例如把一个瀑布放在一个并行函数中。

我偶然发现了一个问题,我首先需要执行一个查询,然后在可以同时执行的其他查询中使用该查询的结果。 代码看起来像这样:

async.waterfall([ function(callback) { connection.query( query, function(err, rows, fields) { if (!err) { callback(null,rows); } else { callback(null,"SORRY"); } } ); }, async.parallel([ function(resultFromWaterfall,callback) { connection.query(query, function(err, rows, fields) { if (!err) { callback(null,rows); } else { callback(null,"SORRY"); } } ); }, function(resultFromWaterfall,callback) { connection.query(query, function(err, rows, fields) { if (!err) { callback(null,rows); } else { callback(null,"SORRY"); } } ); } ]) ], finalCallback ); 

现在我的问题是从瀑布function访问的结果,并在并行function中使用它。

 async.waterfall([ function(callback) { connection.query(query, function(err, rows, fields) { if (!err) { callback(null, rows); } else { callback(null, "SORRY"); } } ); }, function(prevData,callback){ console.log(prevData);//Use it whereever you want. async.parallel([ function(callbackOfAsyncParallel) { connection.query(query1, function(err, rows1, fields1) { if (!err) { callbackOfAsyncParallel(null, rows1); } else { callbackOfAsyncParallel(null, "SORRY1"); } } ); }, function(callback) { connection.query(query2, function(err, rows2, fields2) { if (!err) { callbackOfAsyncParallel(null, rows2); } else { callbackOfAsyncParallel(null, "SORRY2"); } } ); } ],function mainCBOfParallel(err,reuslts){ if(!err){ //this will be done after tasks in async.parallel are finished. callback(null,results); //results[0]===>rows1 //results[1]===>rows2 } }); } ], finalCallback); 

你的代码有两个错误,

  1. 任务应该是一个执行的function。
  2. async.parallel在其任务函数中只有callback。

更新

有一些callback( callbackOfAsyncParallel ),当async.parallel的任务完成时将会调用它。

它不应该调用async.waterfallcallback( callback )。如果可能,可能会出现错误/意外的结果。

尝试这个..

  async.waterfall([ function(callback) { connection.query(query, function(err, rows, fields) { if (!err) { callback(null, rows); } else { callback(null, "SORRY"); } } ); }, function(resultFromWaterfall, callback) { async.parallel([ function() { connection.query(query, function(err, rows, fields) { if (!err) { callback(null, rows); } else { callback(null, "SORRY"); } } ); }, function() { connection.query(query, function(err, rows, fields) { if (!err) { callback(null, rows); } else { callback(null, "SORRY"); } } ); } ]); } ], finalCallback);