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、 还有一个问题就是,我怎样获取异常信息,是我写法不对?或者说应该怎么写。
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实现的代码如下,就不再描述了,看代码吧,也不难理解。
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(){.....})),
@老赵 在微博里面你是表达的这个意思吧?下午单位上班没好多跟你沟通
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就可以运行哦)