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");
---记录,分享。转载请注明出处!
functional javascript的更多相关文章
- [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 ...
- [在读]functional javascript
讲javascript函数化编程的一本书,逛淘宝正好看到有一家卖英文书的,顺手就买了,目前搁置.
- Javascript中的Bind 、Call和Apply
看以下代码: var bind = Function.prototype.call.bind(Function.prototype.bind); 第一眼看上去,我能猜出它究竟是用来做什么的.它把x.y ...
- Function Currying in javascript 的一些注释
理解函数柯里化(Function Currying ),最关键的是理解下面这个函数: function curry(fn){ var args = Array.prototype.slice.call ...
- 用函数式编程对JavaScript进行断舍离
译者按: 当从业20的JavaScript老司机学会函数式编程时,他扔掉了90%的特性,也不用面向对象了,最后发现了真爱啊!!! 原文: How I rediscovered my love for ...
- Understanding Delegated JavaScript Events
While I ended up using a CSS-only implementation for this pen, I started by writing it mostly using ...
- 大神是怎样用函数式JavaScript计算数组平均值的
译者按: 有时候一个算法的直观.简洁.高效是需要作出取舍的. 原文: FUNCTIONAL JAVASCRIPT: FIVE WAYS TO CALCULATE AN AVERAGE WITH ARR ...
- 每个JavaScript开发人员应该知道的33个概念
每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...
- (转) [it-ebooks]电子书列表
[it-ebooks]电子书列表 [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...
随机推荐
- io cache
http://blog.163.com/digoal@126/blog/static/163877040201571511020418 http://dirlt.com/
- 《嵌入式Linux基础教程》补充阅读建议电子数目下载
第二章 <Linux内核设计与实现(原书第三版)> <深入理解Linux内核(第三版)> <深入理解Linux虚拟内存管理> 其他与Linux相关的电子书下载地址: ...
- apt-mirror is already running(已运行)错误解决方案
运行sudo apt-mirror却无法启动服务了.而是给出了一行错误提示信息: apt-mirror is already running, exiting at /us ...
- 小白日记52:kali渗透测试之Web渗透-HTTPS攻击(Openssl、sslscan、sslyze、检查SSL的网站)
HTTPS攻击 全站HTTPS正策划稿那位潮流趋势 如:百度.阿里 HTTPS的作用 CIA 解决的是信息传输过程中数据被篡改.窃取 [从中注入恶意代码,多为链路劫持] 加密:对称.非对称.单向 HT ...
- CNZZ每天百亿条日志写入,SLS+ODPS轻松拆招
如果你是一个站长,想要提交一个查询,从一亿多条日志中找出从湖南省发出.使用ISP电信.通过百度搜索跳转到达的访问日志.该怎么做? 别急,在接收到您的查询条件后,CNZZ可以快速通过SLS(简单日志服务 ...
- mysql模糊查询 like/REGEXP
原文:mysql模糊查询like/REGEXP 增删改查是mysql最基本的功能,而其中查是最频繁的操作,模糊查找是查询中非常常见的操作,于是模糊查找成了必修课. like模式 like意思是长得像, ...
- LearnMVC5-AddAModel
本人是MVC新手,将从微软官网学习MVC并将看过的英文文档翻译成中文,由于本人英文水平不好,有翻译不准确.错误的地方万望指出,我看到后将会在第一时间修改.另外也希望这一系列文章能为后来者起到引导作用. ...
- mysql 中浮点型与定点型记录
为了能够引起大家的重视,在介绍浮点数与定点数以前先让大家看一个例子: mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2)); Qu ...
- umbraco表单
view Model定义类 controller 创建Form @HTML.RenderPartial(“”,)
- IO输入输出 2
编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt pa ...