(转载请注明出处!)

今早带我的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");

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

functional javascript的更多相关文章

  1. [Functional Programming ADT] Debug a Functional JavaScript composeK Flow

    When using ADTs in our code base, it can be difficult to use common debugging tools like watches and ...

  2. [在读]functional javascript

    讲javascript函数化编程的一本书,逛淘宝正好看到有一家卖英文书的,顺手就买了,目前搁置.

  3. Javascript中的Bind 、Call和Apply

    看以下代码: var bind = Function.prototype.call.bind(Function.prototype.bind); 第一眼看上去,我能猜出它究竟是用来做什么的.它把x.y ...

  4. Function Currying in javascript 的一些注释

    理解函数柯里化(Function Currying ),最关键的是理解下面这个函数: function curry(fn){ var args = Array.prototype.slice.call ...

  5. 用函数式编程对JavaScript进行断舍离

    译者按: 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! 原文: How I rediscovered my love for ...

  6. Understanding Delegated JavaScript Events

    While I ended up using a CSS-only implementation for this pen, I started by writing it mostly using ...

  7. 大神是怎样用函数式JavaScript计算数组平均值的

    译者按: 有时候一个算法的直观.简洁.高效是需要作出取舍的. 原文: FUNCTIONAL JAVASCRIPT: FIVE WAYS TO CALCULATE AN AVERAGE WITH ARR ...

  8. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  9. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

随机推荐

  1. 文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别

    这两天在调优数据库性能的过程中需要降低操作系统文件Cache对数据库性能的影响,故调研了一些降低文件系统缓存大小的方法,其中一种是通过修改/proc/sys/vm/dirty_background_r ...

  2. epoll的使用

      http://blog.csdn.net/ljx0305/article/details/4065058 epoll - I/O event notification facility 在linu ...

  3. IDEA 升级14.1提示org/hibernate/build/gradle/publish/auth/maven/AuthenticationManager:Unsupported major.minor version 51.0

    在看到“Unsupported major.minor version 51.0”这样的错误描述时,就基本可以肯定是jdk版本不正确导致.但是提示的类非业务系统,而是来自IDEA.因此去其官网检索了下 ...

  4. spring框架七大模块

    1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性.这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并 ...

  5. 关于composer

    Composer PHP依赖管理的新时代http://segmentfault.com/a/1190000000353129 Composer 的主页   https://getcomposer.or ...

  6. centos6.4使用man查找命令时,报错No manual entry for xxxx

    前提:安装man的命令 yum -y install man 使用man报错 [root@localhost objs]# man fcntlNo manual entry for fcntl[roo ...

  7. 二进制序列化框架easypack发布啦!

    简介 easypack是基于boost.serialization的二进制序列化框架,使用极其方便. Examples 基本类型 int age = 20; std::string name = &q ...

  8. 1.7.2 Velocity Search UI

    1. Velocity Search UI solr包含了一个简单的搜索UI界面,是基于VelocityResponseWrite(也被叫做 Solritas)的.这里演示了几个有用的功能,如搜索,分 ...

  9. 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

    作者:阿里云用户mr_wid ,z)NKt#   @I6A9do   如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV   RsfTUb)<   投票标题:  28.[阿里云 ...

  10. Java中String常用方法

    java中String的常用方法1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len= ...