使用node.js&;async.js:序列以错误的顺序执行?
我正在为节点应用程序使用express和async.js。我的app.js中有以下代码:使用node.js&;async.js:序列以错误的顺序执行?,node.js,express,async.js,Node.js,Express,Async.js,我正在为节点应用程序使用express和async.js。我的app.js中有以下代码: var resultObject = {}; app.get('/average', function(req, res) { async.series([ function(callback) { //This does some complex computations and updates the resultObject routes.avg(req.query.ur
var resultObject = {};
app.get('/average', function(req, res) {
async.series([
function(callback) {
//This does some complex computations and updates the resultObject
routes.avg(req.query.url, resultObject);
console.log('1');
callback();
}
,
function(callback) {
res.send(resultObject);
console.log('2');
callback();
}
]);
});
问题是res.send(…)在第一个函数中的复杂计算完成之前激发。因此,发送的对象为空。我的代码中是否有错误,或者我是否正确使用了async.js?或许可以尝试以下方法:
async.series([
function(callback) {
routes.avg(req.query.url, resultObject);
console.log('1');
callback();
},
function(callback) {
console.log('2');
callback();
}
],
function(err, results){
if(!err)
res.send(resultObject);
else
//do something here for error?
});
根据您的评论,问题在于
routes.avg
方法是异步的。这意味着该方法将被执行,但不会阻止程序继续,这意味着序列中的第二个闭包几乎在第一个闭包之后立即被调用
问题不在于async.series
调用中的闭包被无序调用,而是在routes.avg
完成之前,闭包1中的回调
不会被执行
要解决此问题,您可以将回调
传递到routes.avg
调用中,并编辑routes.avg
方法,以便在完成所有计算后调用回调闭包。这样,在routes.avg
方法调用传递给闭包1的回调之前,不会执行序列中的第二个闭包
如果您没有权限更改routes.avg
方法,那么您必须找到另一种方法,在从async调用传递给closure 1的回调
参数之前,检测它何时完成工作。调用第二个函数将毫无用处。另外,这不起作用,行为仍然是我上面描述的。根据您粘贴的代码,resultObject无论如何都是空的,除非routes.avg修改它。你有剩下的代码吗?这些方法被无序执行似乎是不合理的。这正是它所做的,它修改了resultObject。问题是res.send()在修改对象的函数完成计算之前触发。routes.avg是异步方法吗?是。我想知道问题是否在于该方法是导出的,而不是在app.js中通过回调直接调用。