我正处于POST调用的接收端,该调用包含一个对象数组(requestArray)。在我响应POST之前,我需要按顺序通过一系列函数传递数组的对象。我选择了异步库来帮助我完成这项任务,但是我很难控制代码的执行流程。
我使用全局数组来存储每个函数的结果(responseArray)。一些功能取决于先前功能的结果。我不想使用async.waterfall()因为1.我将不得不重写我的代码和2.我可能会遇到相同的早期循环终止问题。以下是我的代码问题代码。
select
async.series()中的每个函数都返回callback(null,result)。在process1()返回其回调之后,async.eachSeries()之前跳转到下一个数组条目,这是理想的。但是,async.eachSeries()在返回所有async.series()结果之前执行POST响应。我怎么能修改我的代码,以便async.eachSeries()在发送POST响应之前从process1-3返回所有importArray结果(exportArray)后完成执行?
答案 0 :(得分:1)
我建议您轻松遵循代码的异步性质,稍微重命名您的回调。还要等到每个系列完成后,将res.send
移动到eachSeries
最终回调,并传递到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.');
});
});
答案 1 :(得分:1)
在@Bulkan的帮助和修补之后,我得到的代码是在我的老朋友的帮助下异步运行的," flag"。这是代码:
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.');
}
});
});