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
});
来源:oschina
链接:https://my.oschina.net/u/153403/blog/187023