我正在为节点应用程序使用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.url, resultObject);
console.log('1');
callback();
}
,
function(callback) {
res.send(resultObject);
console.log('2');
callback();
}
]);
});
问题是res.send(...)在第一个函数中的复杂计算完成之前触发。因此,发送的对象是空的。我的代码中是否有错误,或者我没有正确使用async.js?
答案 0 :(得分:1)
根据您的评论,问题是您的routes.avg
方法是异步的。这意味着该方法被执行但不会阻止程序继续执行,这意味着系列中的第二个闭包几乎在第一个闭包后立即被调用。
问题不在于async.series
调用中的闭包是无序调用的,而是在callback
之前没有任何东西可以阻止关闭1中的routes.avg
被执行完了。
要解决此问题,您可以将callback
传递到routes.avg
调用,然后编辑routes.avg
方法,以便在完成所有计算后调用回调闭包。这样,在callback
方法调用传递给闭包1的routes.avg
之前,系列中的第二个闭包将不会被执行。
如果您无权更改routes.avg
方法,那么在调用从异步传递给闭包1的callback
参数之前,您必须找到另一种方法来检测它何时完成它的工作
答案 1 :(得分:0)
也许尝试这样的事情:
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?
});