(转载请注明出处!)

今早带我的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. 关于android:inputType属性的说明

    <EditText android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  2. Android(java)学习笔记65:线程的生命周期

    1. 我们学习线程本质就是学习如何开始线程和终止线程.下面这个关于线程的生命周期图,要牢记: 新建状态:当程序使用new关键字创建了一个线程之后,该线程就处于新建状态.此时和其他Java对象一样,它仅 ...

  3. 安卓Design包之CoordinatorLayout配合AppBarLayout,ToolBar,TabLaout的使用

    转载: CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用 控件的简单介绍: AppBarLayout:它是继承LinerLayout实现的一个V ...

  4. jquery移除、绑定、触发元素事件使用示例详解

    这篇文章主要介绍了jquery移除.绑定.触发元素事件使用示例详解,需要的朋友可以参考下. unbind(type [,data]) //data是要移除的函数 $('#btn').unbind(&q ...

  5. Shell学习笔记 - Shell变量

    一.变量的命名 变量名必须以字母或下划线开头,由字母.数字.或下划线组成,变量名的长度不能超过255个字符. 二.变量的分类 1. 用户自定义变量 2. 环境变量 3. 位置参数变量 4. 预定义变量 ...

  6. python备忘录

    本文主要是记录一下python,比较详尽的python学习资料: Python学习笔记_王纯业 http://pan.baidu.com/s/1eQrDEYA 部分有详细的博文链接 1.字符串: 切片 ...

  7. 自定义UISearchDisplayController中搜索到结果的cell的位置

    #pragma mark - UISearchBarDelegate//当搜索文本被改变的时候调用 - (void)searchBar:(UISearchBar *)searchBar textDid ...

  8. SlickOne -- 基于Dapper, Mvc和WebAPI 的快速开发框架

    前言:在两年前,项目组推出了基于Dapper,Mvc和WebApi的快速开发框架,随着后续Slickflow产品的实践和应用,今再次对SlickOne项目做以回顾和总结.其目的是精简,持续改进,保持重 ...

  9. C#微信开发回复信息

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web;usi ...

  10. 清除层div浮动

    clearboth { clear: both; display: block; height: 0; font-size: 0; overflow: hidden; } <div class= ...