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