猫鼬承诺和蓝鸟

时间:2015-08-04 17:38:03

标签: javascript node.js mongodb promise

节点是否会有内置的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()样式

1 个答案:

答案 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承诺转换为众所周知的格式。