使mongoose查询与bluebird的反射相结合

时间:2017-01-24 14:19:32

标签: node.js mongodb mongoose promise bluebird

我正在尝试将Bluebird与猫鼬一起使用。这是我的实施。

const Bluebird = require('bluebird');
const mongoose = require('mongoose');
const Entity = require('./entity');
mongoose.Promise = Bluebird;

现在我尝试做这样的事情。

let promises = [];
promises.push(Entity.findOne({ country: 'HONGKONG' }));
promises.push(Entity.findOne({ country: 'INDIA' }));
promises.push(Entity.findOne({ country: 'THAILAND' }));

我知道上述查询没有意义。它只是多重承诺的一个例子。

现在我尝试实施Bluebirds反射

return Bluebird.all(promises.map(function (promise) {
  return promise.reflect();
}))
  .then(response => {
    console.log(response.filter(r => r.isFulfilled() ));
    console.log(response.filter(r => !r.isFulfilled() ));
  }).catch(err=>{
    console.log(err);
  })

我收到错误promise.reflect is not a function

但是,当我这样做时,它运作正常。

promises.push(new  Bluebird( (resolve, reject) => resolve(Entity.findOne({ country: 'HONGKONG' } )) ));
promises.push(new  Bluebird( (resolve, reject) => resolve(Entity.findOne({ country: 'INDIA' } )) ));
promises.push(new  Bluebird( (resolve, reject) =>  resolve(Entity.findOne({ country: 'THAILAND' } )) )); 

我的问题是,为什么mongoose没有正常实施蓝鸟的承诺。我是否需要使用Bluebird明确解决每个查询?

1 个答案:

答案 0 :(得分:1)

我认为它失败了,因为.findOne()不返回Promise,而是返回Query对象。您必须在最后添加.exec()

尝试:

let promises = [];
promises.push(Entity.findOne({ country: 'HONGKONG' }).exec());
promises.push(Entity.findOne({ country: 'INDIA' }).exec());
promises.push(Entity.findOne({ country: 'THAILAND' }).exec());

Here您有关于Mongoose中Promise的更多信息。还解释了为什么需要使用.exec()函数。