使用node.js& async.js:系列执行顺序错误?

时间:2013-07-24 13:20:28

标签: 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.url, resultObject);
      console.log('1');
      callback();
    }
    ,
    function(callback) { 
      res.send(resultObject);
      console.log('2');
      callback();
    }
  ]);
});

问题是res.send(...)在第一个函数中的复杂计算完成之前触发。因此,发送的对象是空的。我的代码中是否有错误,或者我没有正确使用async.js?

2 个答案:

答案 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?
});