Node.js express 之mongoose 从异步回调函数返回值,类似于同步

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值