Node.js是很好,异步回调模式返回值让我头疼不已啊,今日还是写下今天学习的成果,起由是因为在使用mongoose查询的时候,多个查询相互依赖会层层嵌套,看起来N不爽,我们可以使用并行查询完毕然后,返回想要的结果即可,代码看起来会美观很多,例如:
1
2
3
4
5
|
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返回。
看我设计的就是死活得不到想要的值,懂的一看便知道怎么回事
1
2
3
4
5
6
7
|
module.exports.findUser =
function
(condition){
var
userinfo;
User.findOne(condition,
function
(err,findUser){
userinfo = findUser;
});
return
userinfo;
//返回的结果始终是undefined
};
|
javascript是按照顺序解析的,到查询的时候是异步执行还没有赋值就直接返回了。
我想要的理想设计方法
1
2
3
4
|
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也可以解决:
1
2
3
4
5
6
7
8
9
10
11
|
//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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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
});
|