Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用node.js&;async.js:序列以错误的顺序执行?_Node.js_Express_Async.js - Fatal编程技术网

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

使用node.js&;async.js:序列以错误的顺序执行?,node.js,express,async.js,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.ur

我正在为节点应用程序使用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?

或许可以尝试以下方法:

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

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

问题不在于
async.series
调用中的闭包被无序调用,而是在
routes.avg
完成之前,闭包1中的
回调
不会被执行

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


如果您没有权限更改
routes.avg
方法,那么您必须找到另一种方法,在从async调用传递给closure 1的
回调
参数之前,检测它何时完成工作。

调用第二个函数将毫无用处。另外,这不起作用,行为仍然是我上面描述的。根据您粘贴的代码,resultObject无论如何都是空的,除非routes.avg修改它。你有剩下的代码吗?这些方法被无序执行似乎是不合理的。这正是它所做的,它修改了resultObject。问题是res.send()在修改对象的函数完成计算之前触发。routes.avg是异步方法吗?是。我想知道问题是否在于该方法是导出的,而不是在app.js中通过回调直接调用。