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

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

原文地址:https://www.cnblogs.com/yyrdl/p/4787509.html