我正在为节点应用程序使用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?
根据您的评论,问题在于您的routes.avg
方法是异步的。这意味着该方法将被执行,但不会阻止程序继续执行,这意味着您的系列中的第二个闭包几乎在第一个闭包之后立即被调用。
问题不在于async.series
调用中的闭包被无序调用,而是没有什么可以阻止您callback
的闭包1在routes.avg
完成之前被执行。
要解决此问题,您可以将您callback
的routes.avg
调用传递给您,然后编辑该routes.avg
方法,以便在完成所有计算后调用回调闭包。这样,您的系列中的第二个闭包将在callback
该routes.avg
方法调用传递给闭包1的情况下执行。
如果您无权更改该routes.avg
方法,则必须在调用callback
从异步传递给闭包1的参数之前,找到另一种方法来检测它何时完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句