面对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
有任何建议如何更好地使用它吗?
答案 0 :(得分:1)
Mongoose使用Promises / A +一致的承诺。为了向后兼容,Mongoose 4默认返回mpromise
个承诺。
如果要使用高级承诺功能,则应使用蓝鸟或本机ES6承诺等库。要做到这一点,只需将mongoose.Promise
设置为您最喜欢的ES6风格的承诺构造函数,而mongoose将使用它:
require('mongoose').Promise = Promise;
// or
require('mongoose').Promise = require('bluebird');
答案 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){
});