0

我将 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?

4

2 回答 2

1

根据您的评论,问题在于您的routes.avg方法是异步的。这意味着该方法被执行但不会阻止程序继续执行,这意味着您的系列中的第二个闭包几乎在第一个闭包之后立即被调用。

问题不在于async.series调用中的闭包被无序调用,而是没有什么可以阻止您callback的闭包 1 在完成之前执行routes.avg

要解决此问题,您可以将您的调用传递给callbackroutes.avg,并编辑该routes.avg方法,以便在完成所有计算后调用回调闭包。callback这样,在方法调用传递给闭包 1之前,您的系列中的第二个闭包不会被执行routes.avg

如果您无权更改routes.avg方法,那么您必须找到另一种方法来检测它何时完成,然后再调用callback从异步传递给闭包 1 的参数。

于 2013-07-24T15:08:58.810 回答
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?
});
于 2013-07-24T14:04:29.983 回答