js中的嵌套函数用的很多,很牛叉,那为何要平面化?

  • 易懂(自己及他人)
  • 易修改(自己及他人)

平时Ajax调用写法(基于jQuery)

$.post('url', jsonObj,
function (data)
{
if(data)
{
var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation successful!' });
setTimeout(function () { tips.close(); }, 2000);
}
else
{
var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation Failed!' });
setTimeout(function () { tips.close(); }, 2000);
}
}
);

缺点是什么?

  1. 函数嵌套后,理解起来比较吃力
  2. 函数嵌套后,一行函数调用写成了很多行,很容易因为逗号、括号等造成语法错误
  3. jQuery和liger在应用代码中强耦合,要是以后要更换UI框架,需要进行地毯式搜索...

加入延迟特性 - Deferred

var ajaxHandler = $.post('url', params);
ajaxHandler.done(checkServerResponse); var checkServerResponse=function(result)
{
if(result)
{
var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation successful!' });
setTimeout(function () { tips.close(); }, 2000);
}
else
{
var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation Failed!' });
setTimeout(function () { tips.close(); }, 2000);
}
}

释疑:

  1. 改后的js与先前的没有很大区别:如果js采用了OO方式编写,再来看这段代码就很清晰了(可以简单的把checkServerResponse理解为一个private的class方法,这样会很容易理解编写意图)
  2. 要是有多个ajax请求呢?可以写成$.when($.post('url1'), $.post('url2')).done(this.checkServerResponse);类似于合并的意思,并且checkServerResponse函数的参数是2个,分别对应2个ajax请求的result
  3. 要是有多个后续请求呢?可以写成$.when($.post(url)).then(handler1).then(handler2).done(successHandler).always(alwaysHandler).fail(failHandler);

用jQuery的事件来解耦 - 不依赖具体技术

先要注册事件:

$(document).on("saveSuccess", onSaveSuccess);
$(document).on("saveFail", onSaveFail);

然后改造checkServerResponse函数:

var checkServerResponse= function (result) {
if (result)
$(document).trigger("saveSuccess");
else
$(document).trigger("saveFail");
}

好处:

逻辑代码具体不依赖于具体技术,比如上面的onSaveSuccess和onSaveFail,可以是下面的ligerUI:

onSaveSuccess: function () {
var tips = $.ligerDialog.tip({ title: 'Tip', content: 'OK!' });
setTimeout(function () { tips.close(); }, 2000);
},
onSaveFail: function () {
var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Fail!' });
setTimeout(function () { tips.close(); }, 2000);
}

也可以是下面的:

onSaveSuccess: function () {
alert("OK");
},
onSaveFail: function () {
alert("Fail");
},

其实就是接口隔离的原理。

用Pub/Sub模式来解耦 - 不依赖具体技术

这种方式比起上面jQuery原生的事件处理方式更加专业,比如:amplify

使用方式就看基本类似,如下:

amplify.subscribe("saveSuccess", this.onSaveSuccess);
amplify.subscribe("saveFail", this.onSaveFail); checkServerResponse: function (result) {
if (result)
amplify.publish("saveSuccess");
else
amplify.publish("saveFail");
}

amplify比jQuery原生的事件好的地方在于amplify支持优先级,并且可以在订阅函数中控制是否继续执行后续的订阅函数,具体用法大家可以参考amplify官网。

重构JS代码 - 让JS代码平面化的更多相关文章

  1. Google Analytics统计代码GA.JS中文教程

    2010-12-06 11:07:08|  分类: java编程 |  标签:google  analytics  ga  js  代码  |举报|字号 订阅     Google Analytics ...

  2. js实现一套代码来控制所有的运动,图片的淡入淡出,winth,height的变宽

    介绍了那么多运动,這次一套代码实现所有运动 1.html代码和css代码,只是定义一个div <style> div{ width:200px; height:200px; margin: ...

  3. JS弹出窗口代码大全(详细整理)

    1.弹启一个全屏窗口 复制代码代码如下: <html> <body http://www.jb51.net','脚本之家','fullscreen');">; < ...

  4. [JS]以下是JS省市联动菜单代码

    以下是JS省市联动菜单代码: 代码一: <html> <head> <title></title> <script language=" ...

  5. 使用Underscore.js的template将Backbone.js的js代码和html代码分离

    这段时间在学习Require.js和Backbone.js的过程中,发现有些项目里的HTML代码都是写在View的js代码里面的,渲染的时候需要对Collection进行循环,再将HTML代码拼接上去 ...

  6. 省市区(县)三级联动代码(js 数据源)

    ylbtech-JavaScript-Utility:省市区(县)三级联动代码(js 数据源) 省市区(县)三级联动代码(js 数据源) 1.A,源代码(Source Code)返回顶部 1.A.1, ...

  7. 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。

    一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...

  8. c#调用js,以及js调用C#里的函数, c#自己生成js代码,实现对web的控制

    using mshtml;using System;using System.Collections.Generic;using System.Linq;using System.Security.P ...

  9. 使用highlight.js高亮你的代码

    在逛别人的博客的时候,看见别人的代码的例子使用了高亮的语法,无论是java,js还是php等等语言,都会自动的对关键字进行高亮. 于是在前几天自己写了一个博客,遇到code时,自然就想到了别人网站如何 ...

  10. js文字向上滚动代码

    js文字向上滚动代码 <style>.pczt_pingfen_jhxs_news1{ width:397px;  background:#edfafd; padding-top:2px; ...

随机推荐

  1. java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;

    <java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...

  2. 章节六、3-读取Properties属性文件

    一.如何读取Properties文件1.创建一个名为ReadingProperties的类 2.创建一个.propertise属性的文件,创建的方式参考“二”中步骤 3.写入如下代码 package ...

  3. c++趣味之变量名,颠覆所有教科书的VisualStudio

    GCC不参与这次的趣味. 所有的教程都会告诉你,c++的变量名,类名,函数名都应该是字母或下划线开头的字母.数字.下划线组合,像这样: int _abc123; 实际上,VisualStudio并不遵 ...

  4. HDU 1840 Equations (简单数学 + 水题)(Java版)

    Equations 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1840 ——每天在线,欢迎留言谈论. 题目大意: 给你一个一元二次方程组,a(X^2 ...

  5. ORACLE Index Lookup索引访问路径总结

    在ORACLE中,索引访问/查找(Index Lookup)路径有五种方式,分别为INDEX UNIQUE SCAN.INDEX RANGE SCAN.INDEX FULL SCAN.INDEX FA ...

  6. java笔记----面试题总结(一)【转】

    1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...

  7. CentOS6.8下MySQL MHA架构搭建笔记

    转载请注明出处,本文地址:http://www.cnblogs.com/ajiangg/p/6552855.html 以下是CentOS6.8下MySQL MHA架构搭建笔记 IP资源规划: 192. ...

  8. SQL Server DATA文件夹下audittrace20180124152845_52.trc类文件异常增多

    同事告知某现场SQL Server2008R2数据库的DATA文件夹下audittrace开头的trc文件不断增多,占用较大空间,因此需要关停,尝试解决步骤如下: 1.查看是否有后台开启的trace ...

  9. WebClient图片下载

    使用WebClient下载文件非常方便,针对有部分网站通过请求头的Referer,做了图片防盗链,可以在webClient加上Referer 来模拟请求 string basePath = Path. ...

  10. 高通 NXP NFC(PN547PN548) 移植流程 android6.0

    一.驱动部分 首先向NXP 的 fae要android 6.0 bring up的代码,如:NFC_NCIHALx_AR0F.4.3.0_M_NoSE 结构目录如下: 1. 添加驱动文件 高通平台需使 ...