【问题标题】:Using node.js & async.js: series executing in the wrong order?使用 node.js 和 async.js:系列执行顺序错误?
【发布时间】:2013-07-24 23:08:58
【问题描述】:

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

【问题讨论】:

  • 根据您粘贴的代码,resultObject 无论如何都会为空,除非 routes.avg 修改它。你有剩下的代码吗?方法被乱序执行似乎不太合理。
  • 这正是它所做的,它修改了resultObject。问题是 res.send() 在修改对象的函数完成计算之前触发。
  • routes.avg 是异步方法吗?
  • 是的。不知道是不是问题是方法是导出的,而不是直接在app.js中用回调调用的。

标签: node.js express async.js


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    也许可以试试这样的:

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

    【讨论】:

    • 那时调用第二个函数根本没有用处。另外,这不起作用,行为仍然是我上面描述的。
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 2013-06-12
    • 2015-06-09
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多