异步并行最终回调不会触发

时间:2015-10-12 20:13:09

标签: javascript node.js mongodb asynchronous callback

我确实有一个异步并行块来对MongoDB执行两个查询。 在函数的每一步(回调)我有一个有效的返回结果,没有任何错误被触发。我做了调试,所有步骤都在工作,但最终回调没有触发,我无法通过断点到达其状态。 有人知道会发生什么吗?

async.parallel([

// first Query
function(callback){
  this._game.findOne({'_id': gameId}, function(err, result){
    if(err){return callback(err);}
    else if(result) {
      callback(null, result);
    }
  });
},

// second Query
function(callback){
  this._player.findOne({'_id': playerId}, function(err, result){
    if(err){return callback(err);}
    else if(result) {
      callback(null, result);
    }
  });
}
],

  // Final callback to send all 2 Results -> which is not working...
  function(error, results){

    if(results){

      res.status(200);
      res.send(results);
    }
  }
);`

2 个答案:

答案 0 :(得分:1)

你没有处理Mongo没有找到任何结果的可能性。在这种情况下,它会将errresult的回调调用为null。当发生这种情况时,您并行运行的功能不会调用它们的回调,因此最终的功能永远不会运行。在这种情况下,您所做的事情取决于您,但您需要使用某些内容调用callback函数。

你没有得到任何结果的原因很可能是playerId和gameId是字符串而_id默认是ObjectId。添加var ObjectId = require('mongodb').ObjectId;,然后将playerId替换为ObjectId(playerId),您可能会看到结果。

答案 1 :(得分:0)

这是我调试它的方式:

async.parallel([

// first Query
function(fq_callback){
  this._game.findOne({'_id': gameId}, function(fq_err, fq_result){
    if(fq_err){
      console.log('err from _game.findOne');
      return fq_callback(fq_err);
    }
    else if(fq_result) {
      console.log('result from _game.findOne');
      fq_callback(null, fq_result);
    }
  });
},

// second Query
function(sq_callback){
  this._player.findOne({'_id': playerId}, function(sq_err, sq_result){
    if(sq_err){
      console.log('err from _player.findOne');
      return sq_callback(sq_err);
    }
    else if(sq_result) {
      console.log('result from _player.findOne');
      sq_callback(null, sq_result);
    }
  });
}
],

  // Final callback to send all 2 Results -> which is not working...
  function(fn_error, fn_results){
    console.log('in final callback');
    if(fn_error) console.log('we have error');
    if(fn_results){
      console.log('we have results');
      res.status(200);
      res.send(results);
    }else{
      console.log('we have NO results');
    }

  }
);