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 });