节点是否会有内置的Promise实现,还是我们应该采用一个主要的库?比如Q / Blueblird?我有一个使用async.waterfall的代码,我想将它移动到使用promises。其中一个链接函数是mongoose findOne,它从mongoose 4.0开始返回一个promise,但我知道混合promises类型是不好的做法,因为mongoose使用它自己的promise实现,我想使用Q / Bluebird。我应该在mongoose上使用promsifyAll吗?或者,一旦承诺将在节点中实施,promisify将被弃用 目前代码是:
async.waterfall([
function(done){
User.findOne({ email: reco.mail }, done);
},
function(receiverUser, done){
if (!receiverUser){
} else {
}
// send the model to mongoose to get verified and persisted
reco.save(function (err) {
if (err) {
//handle error
}
return done(err);
});
}
], function(err){
if (err) {
console.error('unexpected error while creating reco', err);
return res.status(500).send({});
}
console.log('reco created successfully', reco);
return res.status(201).send({});
});
我想将其更改为().then.catch()样式
答案 0 :(得分:0)
我建议你保持以下方式,至少我使用这种方法,它的工作原理。请查看下面的代码示例。
var Promise = require('bluebird');
//declaration
userSchema.statics.search = function (query) {
return new Promise(function(resolve, reject){
return mongoose.model('User')
.find(query)
.exec()
.then(function(foundUsers){
resolve(foundUsers);
})
.onReject(function(err){
reject(err);
});
});
};
//using
var UserModel = require('path/to/user/model');
UserModel
.search(<query>)
.then(function(foundUsers){
//do something
})
.catch(function(err){
//so something
});
//declaration
userSchema.methods.saveMe = function () {
var user = this;
return new Promise(function (resolve, reject) {
user.save(function (err) {
if (err) {
reject(err);
} else {
resolve(user);
}
});
});
};
//using
var UserModel = require('path/to/user/model');
var newUser = new UserModel(newUserData);
newUser
.save(function(savedUser){
//do something
})
.catch(function(err){
//so something
});
当然,使用'Promisify'也有助于这种情况,但有几次我遇到问题,所以我决定将Mongoose承诺转换为众所周知的格式。