• 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就可以运行哦) 

  • 相关阅读:
    XCOPY命令默认忽略隐藏文件
    SSAS : 如果在MDX查询中没有指定度量值,那么会怎么处理
    .NET : 存取BLOB数据(Oracle)
    jQuery.getJSON(url, [data], [callback])
    SSAS : 在SSAS 2008的自定义存储过程中取得当前用户名
    再来谈谈json
    .NET :在Visual Studio的不同Tab之间切换
    SSAS : 从现有多维数据集创建挖掘结构
    SQL Server : Browser服务是干什么的
    SSAS2008 : 全新的可扩展插件架构
  • 原文地址:https://www.cnblogs.com/yimu/p/NODE_WINDJS.html
Copyright © 2020-2023  润新知