NodeJs Mongoose承诺然后/ catch

时间:2016-06-16 14:59:59

标签: javascript node.js mongodb mongoose promise

面对Mongoose承诺的问题

MyModel.find().then((data)=> Promise.reject())
       .catch(()=>console.log('first catch'))
       .then(()=>console.log('ok'))
       .catch(()=>console.log('second catch'));

执行后我得到了

first catch
second catch

但如果我只使用原生的Promises:

Promise.reject()
       .catch(()=>console.log('first catch'))
       .then(()=>console.log('ok'))
       .catch(()=>console.log('second catch'));

执行后我得到了

first catch
ok

就Promise而言是好的docs

似乎Mongoose使用自己的promise implementation

我发现我可以通过以下方式解决这个问题

new Promise((resolve, reject) => { MyModel.find().then((data) => reject()) })
       .catch(()=>console.log('first catch'))
       .then(()=>console.log('ok')
       .catch(()=>console.log('second catch'));

根据文档的说法:

first catch
ok

有任何建议如何更好地使用它吗?

2 个答案:

答案 0 :(得分:1)

Mongoose使用Promises / A +一致的承诺。为了向后兼容,Mongoose 4默认返回mpromise个承诺。

如果要使用高级承诺功能,则应使用蓝鸟或本机ES6承诺等库。要做到这一点,只需将mongoose.Promise设置为您最喜欢的ES6风格的承诺构造函数,而mongoose将使用它:

require('mongoose').Promise = Promise;
// or
require('mongoose').Promise = require('bluebird');

Mongoose documentation

答案 1 :(得分:0)

您也可以使用q库进行承诺。  " q":" ^ 1.4.1" q是java脚本promises的人口最多的库。因此我们可以使用多个promises结果。

var Q = require('q');
var promises= Q.all([
Model.find(),
Model2.find(),
Model3.find()
]);
promises.then(function(data){
//console.log(data[0]);
//console.log(data[1]);`enter code here
//console.log(data[2]);
});`enter code here`
promises.then(null,function(err){
});