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

  });
相關文章
相關標籤/搜索