• functional javascript


    (转载请注明出处!)

    今早带我的master跟我分享了他最近看《functional javascript》一书的感悟,瞬间觉得写1w行代码都不如看本好书来的好啊!
    于是在下午的写的项目中就运用了《functional javascript 》一书所介绍的编程思想。具体场景是这样的:在我开发项目的时候会遇到这样一种情况,多个函数在结构上具有较大的相似性,只有部分地方不一致,如果一个一个具体的写的话则显得愚蠢并且低效。如果采用函数式编程的思想代码将会变得非常简洁。

    下面给出代码:

    很容易想到的方式:

    /*
       Created By yyrdl on 2015/9/6
    */
    var mysql_config=require("./final_config.js").mysql;
    var mysql=require("mysql");
    
    var database1 = mysql.createPool(mysql_config.database1);
    var database2 = mysql.createPool(mysql_config.database2);
    var database3 = mysql.createPool(mysql_config.database3);
    
    var database1_query=function(sql,parameters,timeout){
        return new Promise(function(resolve,reject){
            database1.query(sql,parameters,function(err,datas){
                if(err){
                    reject(err);
                }else{
                    resolve(datas);
                }
            });
            if(timeout&&timeout>0)
            {
                setTimeout(function(){
                    reject("timeout");
                },timeout);
            }
        });
    };
    
    var database2_query=function(sql,parameters,timeout){
        return new Promise(function(resolve,reject){
            database2.query(sql,parameters,function(err,datas){
                if(err){
                    reject(err);
                }else{
                    resolve(datas);
                }
            });
            if(timeout&&timeout>0)
            {
                setTimeout(function(){
                    reject("timeout");
                },timeout);
            }
        });
    };
    
    var database3_query=function(sql,parameters,timeout){
        return new Promise(function(resolve,reject){
            database3.query(sql,parameters,function(err,datas){
                if(err){
                    reject(err);
                }else{
                    resolve(datas);
                }
            });
            if(timeout&&timeout>0)
            {
                setTimeout(function(){
                    reject("timeout");
                },timeout);
            }
        });
    };
    
    exports.database1_query=database1_query;
    exports.database2_query=database2_query;
    exports.database3_query=database3_query;
    

    上面的代码明显有很多重复的地方,换种方式就是说操作三个数据库的代码的模式是一样的。下面给出改进后的代码:

    
    /*
       Created By yyrdl on 2015/9/6
    */
    var mysql_config=require("./final_config.js").mysql;
    var mysql=require("mysql");
    
    var database1 = mysql.createPool(mysql_config.database1);
    var database2 = mysql.createPool(mysql_config.database2);
    var database3 = mysql.createPool(mysql_config.database3);
    
    var get_query_func=function (pool){
        return function(){
            var args=arguments;
            return new Promise(function(resolve,reject){
                function cb(err,data){
                    if(err)
                    {
                        reject(err);
                    }else{
                        resolve(data);
                    }
                }
                var arg=[args[0],args[1],cb];
                pool.query.apply(this,arg);
                if(args[2]&&args[2]>0)
                {
                    setTimeout(function(){
                        reject("timeout");
                    },args[2]);
                }
            });
        }
    }
    
    exports.database1_query=get_query_func(database1);
    exports.database2_query=get_query_func(database2);
    exports.database3_query=get_query_func(database3);
    

    与第一种相比,代码量明显少了很多,而且这种方式还有利于后期动态添加。另一种实现方式是:

    /*
       Created By yyrdl on 2015/9/6
    */
    
    var mysql_config=require("./final_config.js").mysql;
    var mysql=require("mysql");
    
    var database1 = mysql.createPool(mysql_config.database1);
    var database2 = mysql.createPool(mysql_config.database2);
    var database3 = mysql.createPool(mysql_config.database3);
    
    var pools={
         "database1":database1,
         "database2":database2,
          "database3":database3
      };
    
    var get_query_func=function (pool_name){
        return function(){
            var args=arguments;
            return new Promise(function(resolve,reject){
                pools[pool_name].query(args[0],args[1],function(err,datas)        
                {
                     if(err)
                     {
                         reject(err);
                      }else{
                         resolve(datas);
                      }
                });
                if(args[2]&&args[2]>0)
                {
                    setTimeout(function(){
                        reject("timeout");
                    },args[2]);
                }
            });
        }
    }
    
    exports.database1_query=get_query_func("database1");
    exports.database2_query=get_query_func("database2");
    exports.database3_query=get_query_func("database3");
    

    ---记录,分享。转载请注明出处!

  • 相关阅读:
    JavaWeb网上图书商城完整项目--day02-3.regist页面输入框失去焦点进行校验
    JavaWeb网上图书商城完整项目--day02-2.regist页面输入框得到焦点隐藏label
    JavaWeb网上图书商城完整项目--27.注册页面之注册按钮图片切换实现
    关于js中值的比较规则问题
    说说null和undefined的那些事
    对象、数组转换字符串
    函数的形参与实参
    switch判断注意点
    删除数组值
    数组的一个强大函数splice,[增,删,改]
  • 原文地址:https://www.cnblogs.com/yyrdl/p/4787509.html
Copyright © 2020-2023  润新知