Node结合Wind.js实现同步编程

关于Node介绍请参阅 http://zh.wikipedia.org/wiki/Node.js

关于Wind.js请参阅 http://windjs.org/cn/

 

今天下午看了一下@老赵的wind.js,之前一直以为就是一个异步/同步编程的呢,但好像不止找一个功能,下午时间仓促就看了一点点同步编程这块。

刚开始的时候遇到了一些小问题,可能由于自身的问题,反正都列出来吧:

1、 进入官网,有点无从下手的感觉,看不到类似于Demo链接或者APIs链接,最后在“文档”中找到一个排序例子(前端);

2、 支持Node,但未发现有demo;

3 、遇到一奇怪问题或者不合理的,require的时候 ,var Wind = require("wind"); Wind必须要这么写,wind这么写就不行了,不知道具体什么用途,一般正常加载类似的http、express、mongoogse,第一个字母都是小写;

4、 还有一个问题就是,我怎样获取异常信息,是我写法不对?或者说应该怎么写。

 

 1 var bubbleSortAsync = eval(Wind.compile("async", function (paramsObject) {
 2          var data = $await(as01(paramsObject));
 3          if (!data.success) {
 4              throw new Exception(data.msg);
 5          }
 6  
 7          var data = $await(as02(paramsObject));
 8          if (!data.success) {
 9              throw new Exception(data.msg);
10          }
11  
12          var data = $await(as03(paramsObject));
13          if (!data.success) {
14              throw new Exception(data.msg);
15          }
16      }));
17  
18      //事务执行
19      var result = bubbleSortAsync(paramsObject).start();
20      
21      console.log(JSON.stringify(result));  //输出的error信息好像是空的,我在14行手工抛异常了
22 
23      

 

 下面来一个“案例分析”吧,也是我在实际项目中遇到的问题,就是执行一件需要操作多个表的业务,Node本身是不支持同步编程的,所以只能操作一个表成功后再通过回调函数

执行另外一个函数方法,成功了再继续回调下一个....看起来比较乱,容易绕晕,调试起来也是蛮麻烦的。

 

Node实现的代码如下,就不再描述了,看代码吧,也不难理解。 

 1 /**
 2  * (游戏中的农作物)成长加速  (未考虑事务回滚)
 3  * 1、判断当前余额是否足够支付
 4  * 2、增加一条交易记录
 5  * 3、修改当前玩家金币数
 6  * .....
 7  */
 8 app.all('/Accelerate',function(req,res){
 9     var paramsObject = {'player_id':'111','cash':20};//此处采用req获取的,这边为了演示,随便写了一个参数
10     hasEnoughCash(res,paramsObject,[cashTrade,updatePlayerCurrCash]);
11 });
12 
13 /**
14  * 是否有足够余额
15  * @param res
16  * @param paramsObject
17  * @param callbackQueue
18  */
19 function hasEnoughCash(res,paramsObject,callbackQueue){
20     mongoose.model("Player").findOne({},function(err,doc){
21         if(err){
22             res.send({'success':false,'err':err.err});
23         } else {
24             if (doc) {
25                 if (callbackQueue && callbackQueue.length >0 ) {
26                     var callback = callbackQueue.shift();
27                     callback(res,paramsObject,callbackQueue);
28                 } else {
29                     res.send({'success':true,msg:''});
30                 }
31             } else {
32                 res.send({'success':false,msg:'余额不足'});
33             }
34         }
35     });
36 }
37 
38 /**
39  * 增加一条交易记录
40  * @param res
41  * @param paramsObject
42  * @param callbackQueue
43  */
44 function cashTrade(res,paramsObject,callbackQueue){
45     mongoose.model("CashTrade").collection.update({},{},function(err){
46         if(err){
47             res.send({'success':false,'err':err.err});
48         } else {
49             if (callbackQueue && callbackQueue.length >0 ) {
50                 var callback = callbackQueue.shift();
51                 callback(res,paramsObject,callbackQueue);
52             } else {
53                 res.send({'success':true,msg:''});
54             }
55         }
56     });
57 }
58 
59 /**
60  * 更改玩家当前余额
61  * @param res
62  * @param paramsObject
63  * @param callbackQueue
64  */
65 function updatePlayerCurrCash(res,paramsObject,callbackQueue){
66     mongoose.model("Player").collection.update({},{},function(err){
67         if(err){
68             res.send({'success':false,'err':err.err});
69         } else {
70             if (callbackQueue && callbackQueue.length >0 ) {
71                 var callback = callbackQueue.shift();
72                 callback(res,paramsObject,callbackQueue);
73             } else {
74                 res.send({'success':true,msg:''});
75             }
76         }
77     });

 

这里用Windjs实现的代码,看上去还是蛮清爽的,从上至下。

这边咨询过老赵一点问题,他建议不要这么写eval(Wind.compile('async',asyncHasEnoughCash)),应该在里面直接eval(Wind.compile('async',function(){.....})),

@老赵 在微博里面你是表达的这个意思吧?下午单位上班没好多跟你沟通 

 1 /**
 2  * (游戏中的农作物)成长加速  (未考虑事务回滚)
 3  * 1、判断当前余额是否足够支付
 4  * 2、增加一条交易记录
 5  * 3、修改当前玩家金币数
 6  * .....
 7  */
 8 app.all('/AsyncAccelerate',function(req,res){
 9     var paramsObject = {'player_id':'111','cash':20};//此处采用req获取的,这边为了演示,随便写了一个参数
10 
11     //将方法转为同步方法
12     var as01 = eval(Wind.compile('async',asyncHasEnoughCash));
13     var as02 = eval(Wind.compile('async',asyncCashTrade));
14     var as03 = eval(Wind.compile('async',asyncUpdatePlayerCurrCash));
15 
16     var bubbleSortAsync = eval(Wind.compile("async", function (paramsObject) {
17         var data = $await(as01(paramsObject));
18         if (!data.success) {
19             throw new Exception(data.msg);
20         }
21 
22         var data = $await(as02(paramsObject));
23         if (!data.success) {
24             throw new Exception(data.msg);
25         }
26 
27         var data = $await(as03(paramsObject));
28         if (!data.success) {
29             throw new Exception(data.msg);
30         }
31     }));
32 
33     //事务执行
34     var result = bubbleSortAsync(paramsObject).start();
35 
36     if (result.status === "succeeded") {
37         res.send({'success':true,'msg':'执行成功'});
38     } else {
39         res.send({'success':true,'msg':'执行失败'});
40     }
41 });
42 
43 function asyncHasEnoughCash(paramObject){
44    //实现具体方法...
45     return {'success':true,'msg':''};
46 }
47 
48 function asyncCashTrade(paramObject){
49     //实现具体方法...
50     return {'success':true,'msg':''};
51 }
52 
53 function asyncUpdatePlayerCurrCash(paramObject){
54     //实现具体方法...
55     return {'success':false,'msg':'故意报错 '};


其实整体看下来还是蛮好的,在后面的工作中会考虑直接引进项目中,这样才会深入的学习了解,也才会遇到问题,哈哈! 

 

 整个项目打包下载 http://sdrv.ms/PI9rPS 文件名:windDemo.rar 
  (只要本地装了Node就可以运行哦) 

 

 

 

 

posted @ 2012-08-23 23:45  易木  阅读(1353)  评论(2编辑  收藏  举报