【问题标题】:q.all() to resolve multiple mongoose queries concurrentlyq.all() 同时解析多个 mongoose 查询
【发布时间】:2015-09-11 01:59:38
【问题描述】:

我正在尝试使用 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){} 永远不会被执行。

【问题讨论】:

    标签: javascript mongoose q


    【解决方案1】:

    AFAIK,q.all() 只处理承诺数组,而不是承诺对象(就像你正在传递)。此外,由于 Mongoose 的 .exec() 已经返回了一个承诺,因此您不必使用 q(...) 包装它们(尽管这样做也无妨)。

    试试这个:

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

    【讨论】:

    • q.all() 参数更改为数组会导致我的代码工作。出于某种原因,这个回答者认为对象是可能的......不知道他为什么这么认为。 stackoverflow.com/a/24396588/404699 q 和 $q 可能是不同的库。
    • @steampowered $q 是一个受q启发的Angular服务,但它不一样:-)(它indeed也接受对象)。
    【解决方案2】:

    在较新版本的 Node 上使用 q 的替代方法是使用原生 Promise.all 方法和猫鼬的 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);
    });
    

    【讨论】:

    • 好吧,我走这条路。除非我需要另一个库,否则我更喜欢使用本机功能。
    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 2020-12-14
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多