Node.js express 之mongoose 从异步回调函数返回值,相似于同步

    Node.js是很好,异步回调模式返回值让我头疼不已啊,今日仍是写下今天学习的成果,起由是由于在使用mongoose查询的时候,多个查询相互依赖会层层嵌套,看起来N不爽,咱们能够使用并行查询完毕而后,返回想要的结果便可,代码看起来会美观不少,例如:
javascript

User.findOne({userid:userid},function(err,findUser){
    Group.find({userid:findUser.userid},function(err,group){
        GroupQZ.find(groupid:group.groupid}.function(err,qz){}
    })
});

以上能够使用eventproxy来并行处理。在一个函数里把三个返回的参数合并成一个json返回。html

看我设计的就是死活得不到想要的值,懂的一看便知道怎么回事java

module.exports.findUser = function(condition){
    var userinfo;
    User.findOne(condition,function(err,findUser){
        userinfo = findUser;
    });
    return userinfo;//返回的结果始终是undefined
};


javascript是按照顺序解析的,到查询的时候是异步执行尚未赋值就直接返回了。
node

我想要的理想设计方法
git

module.exports.findUser= function(condition)
{
    return info;//意思些一个通用函数,传回条件直接返回想要的结果
};


查了好久仍是找到不少解决办法,好比这篇文章http://www.cnblogs.com/rubylouvre/p/3292745.html,讲述node.js的promise库对如何取得异步回调函数,加载模块依赖等等。
github

解决办法:https://npmjs.org/package/express-promiseexpress

            https://github.com/kriszyp/node-promisenpm

promise解决方案排名:https://nodejsmodules.org/tags/promisesjson

原来mongoose自带的promise也能够解决:promise

//Utility function (put it in a better place)
  var saveInPromise = function (model) {

    var promise = new mongoose.Promise();

    model.save(function (err, result) {
      promise.resolve(err, result);
    });

    return promise;
  }

Then you can use it instead of save to chain your promises

  var User = mongoose.model('User');
  var Channel = mongoose.model('Channel');
  var Article = mongoose.model('Article');

  //Step 1
  var user = new User({data: 'value'});
  saveInPromise(user).then(function () {

    //Step 2
    var channel = new Channel({user: user.id})
    return saveInPromise(channel);

  }).then(function (channel) {

    //Step 3
    var article = new Article({channel: channel.id})
    return saveInPromise(article);

  }, function (err) {
    //A single place to handle your errors

  });
相关文章
相关标签/搜索