node会有Promise的内置实现吗?或者我们应该采用一个主要的库吗?比如Q/Blueblird?我有一个使用async.waterfall的代码,我想将它移动到使用promises。其中一个链式函数是mongoose findOne,它从Mongoos4.0开始返回promise,但我知道混合promises类型是不好的做法,因为mongoose使用它自己的promise实现,而我想使用Q/Bluebird。我应该在mongoose上使用promsifyAll吗?或将promisify将被弃用,一旦promise将在节点中实现,当前代码为:
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()样式
发布于 2015-08-05 02:12:29
我建议你保持下面的方式,至少我正在使用这个方法,并且它是有效的。请检查下面的代码示例。
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 promise转换为众所周知的格式。
https://stackoverflow.com/questions/31815790
复制相似问题