(转载请注明出处!)

今早带我的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. javascript 中 in操作符

    in in 操作检查对象中是否有名为 property 的属性.也可以检查对象的原型,以便知道该属性是否为原型链的一部分. 对于一般的对象属性需要用字符串指定属性的名称 var mycar = {ma ...

  2. php模拟多线程

    一:应该知道的: php本身是不支持多线, 但是php的好搭档,apache和linux是支持的,故lamp才是最佳组合,还在使用win服务器的现在知道为什么要用linux吧.既然是模拟的, 就不是真 ...

  3. Linux清除磁盘上的RAID信息

    我的笔记本是DELL的Inspiron 14z,原装存储器是由32G的固态硬盘和512G的机器硬盘组成.后来我自己又给它加了一个256G的固态硬盘,装并装上了CentOS,打算把500G的机械硬盘当资 ...

  4. 给学习IT、编程者的看

    Preface: 我始终认为,对一个初学者来说,IT界的技术风潮...... Content: 我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶.我时常看见自己的DD ...

  5. LeetCode18 4Sum

    题意: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...

  6. 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化

    1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScr ...

  7. [Windows] 解决kmplayer播放rmvb文件音视不同步

    1. 到該帖子 http://www.kmplayer.com/forums/showthread.php?t=8755 下載附件中的4個檔案放到KMP 根 目錄下(此文件已在附件中上传) 2.於KM ...

  8. 整合iis+tomcat

    目的: 将 Tomcat与 IIS整合在一起,共用 80端口.让 iis可以解析 *.asp. *.aspx. *.jsp. servlet和 *.do文件: 第一步:准备工作. 在你的 Tomcat ...

  9. 仿jQuery中undelegate()方法功能的函数

    //跨浏览器事件绑定 function addEvent(obj,type,fn){ if(typeof obj.removeEventListener !='undefined'){ /////// ...

  10. HTML--内联元素与块级元素

    >>内联元素(inline element) a,span,input,select,label,img,textarea,sub,sup,li,i,small,strong,em,b,b ...