q.all()同时解析多个mongoose查询

时间:2015-06-24 18:02:57

标签: javascript mongoose q

我正在尝试使用q promise库同时运行两个mongoose查询。我希望独立地进行两个查询,然后在两个查询完成后使用结果执行一个函数。

我尝试以这种方式设置q.all(),但结果始终在then()中处于暂挂状态。我需要解决查询结果而不是待处理的承诺。

var q = require('q');

var promises = {
    aircraft: q(aircraftModel.findOne({_id: tailNumber})
        .exec()),
    faaAircraft: q(faaAircraftModel.findOne({_id: tailNumber.substring(1)})
        .exec())
};

q.all(promises).then(function(result){
    console.log(result)
}, function(err){
    console.log(err)
})

结果是下面的未决承诺的对象,而不是值。如何从MongoDB中获取这些查询的值?

{ aircraft: { state: 'pending' },
  faaAircraft: { state: 'pending' } }

永远不会执行function(err){}

2 个答案:

答案 0 :(得分:5)

AFAIK,q.all()只处理承诺数组,而不是承诺的对象(就像你传递的那样)。此外,由于Mongoose的.exec()已经回复了一个承诺,你不必使用q(...)包裹它们(尽管如果你这样做也不会受到伤害)。

试试这个:

var promises = [
  aircraftModel.findOne({_id: tailNumber}).exec(),
  faaAircraftModel.findOne({_id: tailNumber.substring(1)}).exec()
];

q.all(promises).then(...);

答案 1 :(得分:2)

在较新版本的Node上使用q的替代方法是使用本地Promise.all方法与mongoose的mpromise

var promises = [
  aircraftModel.findOne({_id: tailNumber}).exec(),
  faaAircraftModel.findOne({_id: tailNumber.substring(1)}).exec()
];

Promise.all(promises).then(function(results) {
    console.log(results);
}).catch(function(err){
    console.log(err);
});