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

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

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返回。

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

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


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

我想要的理想设计方法

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


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

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

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

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

原来mongoose自带的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

  });


你可能感兴趣的:(Promise,同步,node.js,取回异步回调函数值)