我确实有一个异步并行块来对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);
}
}
);`
答案 0 :(得分:1)
你没有处理Mongo没有找到任何结果的可能性。在这种情况下,它会将err
和result
的回调调用为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');
}
}
);