嵌套在async.eachSeries循环中的async.series会尽早终止发送POST响应

我在一个包含一个对象数组(requestArray)的POST调用的接收结束。 在响应POST之前,我需要依次通过一系列函数传递数组的对象。 我select了asynchronous库来帮助我完成这个任务,但是我很难控制代码的执行stream程。

我正在使用全局数组来存储每个函数(responseArray)的结果。 一些function取决于先前function的结果。 我不想使用async.waterfall(),因为1.我将不得不重写我的代码和2.我可能会遇到相同的早期循环终止问题。 下面是我的代码有问题的代码。

app.post('/test', function(req, res) { var importArray = req.body; var iteration = 0; async.eachSeries(importArray, function(data, callback) { var index = importArray.indexOf(data); var element = data.element; exportArray[index] = []; async.series([ function(callback) { process1(data, index, callback); }, function(callback) { process2(element, index, callback); }, function(callback) { process3(element, index, callback); }], function(err, results) { var str = {}; results.forEach(function(result) { if (result) { str += result + ','; } }); //callback(); // callback here = synchronous execution. if (index === req.body.length - 1) { res.send(exportArray); } }); console.log('async.eachSeries() callback iteration # = ' + iteration); iteration++; callback(); // callback here = asynchronous execution. }, function(err){ if( err ) { console.log('Error'); } else { console.log('All data has been processes successfully.'); } }); }); 

async.series()中的每个函数都会返回callback(null,result)。 在process1()返回它的callback之后,async.eachSeries()会跳转到之前的下一个数组入口,这是理想的。 但是,在返回所有async.series()结果之前,async.eachSeries()会执行POST响应。 我怎么能修改我的代码,以便在发送POST响应之前,从process1 – 3返回所有importArray结果(exportArray)之后,async.eachSeries()完成执行?

我build议您轻松跟随代码的asynchronous特性,稍微重新命名您的callback。 还要等到eachSeries已经完成移动res.sendeachSeries最后callback传递的results

这里是更新的代码。

 app.post('/test', function(req, res) { var importArray = req.body; var iteration = 0; async.eachSeries(importArray, function(data, next) { var index = importArray.indexOf(data); var element = data.element; exportArray[index] = []; async.series([ function(cb) { process1(data, index, cb); }, function(cb) { process2(element, index, cb); }, function(cb) { process3(element, index, cb); }], function(err, results) { var str = {}; results.forEach(function(result) { if (result) { str += result + ','; } }); console.log('async.eachSeries() callback iteration # = ' + iteration); iteration++; next(null, results); }); }, function(err, results){ if(err) { return console.log('Error'); } res.send(exportArray); console.log('All data has been processes successfully.'); }); }); 

在@Bulkan和修补程序的帮助下,我得到了代码在我的老朋友“flag”的帮助下asynchronous运行。 代码如下:

 app.post('/test', function(req, res) { var importArr = req.body; var iteration = 0; var flag = false; async.eachSeries(importArr, function(data, cb) { var index = importArr.indexOf(data); var element = data.element; exportArr[index] = []; async.series([ function(cb) { process1(data, index, cb); }, function(cb) { process2(element, index, cb); }, function(cb) { process3(element, index, cb); }], function(err, results) { var str = {}; results.forEach(function(result) { if (result) { str += result + ','; } }); iteration++; if (iteration === req.body.length) { flag = true; res.send(exportArr); } }); console.log('async.eachSeries() callback iteration # = ' + iteration); if (iteration < req.body.length) { cb(); } else if (flag) { cb(); } }, function(err){ if (err) { console.log('Error'); } else { console.log('All data has been processes successfully.'); } }); });