先上原文链接:对jQuery ajax请求成功(失败)回调执行前的统一处理(兼容较老版本jQuery)

原文中已经提到了使用场景了,我觉得这非常适合单页面应用,还有backbone应用中。毕竟ajax回调成功了之后,不代表得到了正确的数据,比如没有登录,或者登录超时,这个时候应该跳转到登录页面。这种集中处理避免了在每个地方都要添加判断。

原文中主要有两处hack,一个是success回调;另一个是done回调;

对于success的hack我理解起来还比较轻松:

  1. 提供一个默认的success空函数。
  2. 如果有提供success回调,则覆盖那个空函数,也就是临时保存真正的回调函数。
  3. 利用$.extend方法覆盖opt中的success函数,在这个函数中首先做条件判断,其实就是自己的业务逻辑代码。在这里我们有控制权决定是否调用真实的success回调函数。
  4. 总结起来就是利用一个新的success函数代替真实的success函数,而新的success函数里面又会调用真实的success函数。

对于done的hack我一开始理解起来很吃力,感觉摸不着北。后来才想通了,这里其实最后hack的目标并不是done本身这个函数,而是hack了done的参数,也就是done的回调函数。

  1. 保存真实的done方法。
  2. 重新定义done函数,但是在这个函数中只有一行代码最重要:done.call(def, _done);
  3. 可以发现虽然我们重新定义了done方法,但是实际上内部代码只是简单的调用一下真实的done方法,只不过传递了一个函数参数_done
  4. 这个函数参数_done就变成了我们最终的回调函数了。其内部会调用到实际提供的回调函数func
  5. 内部还有我们的业务代码,这样我们就有控制权决定是否调用真实的回调函数func
  6. 一开始我就理解错了,我以为我们hack的目标是done函数,我们的业务代码也应该是写在新定义的done函数中,但是发现代码不是这样我就蒙圈里。
  7. 后来才明白实际hack的目标应该是回调函数本身,就像success一样。

下面附上我对setTimeout函数的hack代码:

var realTimeout = window.setTimeout;
window.setTimeout = function(func, time) {
console.log("timeout start");
realTimeout(func, time);
console.log("timeout end"); //这个地方不知道怎么处理了?
}

对ajax的hack的分析的更多相关文章

  1. thinkphp中AJAX返回ajaxReturn()方法分析

    本文分析了thinkphp中AJAX返回ajaxReturn()方法.分享给大家供大家参考,具体如下: 系统支持任何的AJAX类库,Action类提供了ajaxReturn方法用于AJAX调用后返回数 ...

  2. jQuery下ajax事件的简单分析

    昨天写了一篇关于监视页面动态生成元素问题的文章,引起了一些小小的争议,不过我从中学到了很多.文章在这,<jQuery下实现等待指定元素加载完毕>当然 动态生成的节点元素 分很多种情况,这里 ...

  3. jquery中的$.ajax()的源码分析

    针对获取到location.href的兼容代码: try { ajaxLocation = location.href; } catch( e ) { // Use the href attribut ...

  4. jQuery deferred应用之ajax详细源码分析(二)

    在上一节中,我只贴出了$.Deferred的源码分析,并没用讲解怎么使用它,现在我们先看看$.ajax是如何使用它,让我们进行异步任务的处理. 如果没看上节的代码,请先稍微了解一下jQuery Def ...

  5. Ajax的js库分析简化版

    Ajax jquery的库的简化版本 (function(){    //面向外界的唯一变量接口!    var myajax = window.myajax = {};    //作者.版本号等等信 ...

  6. ajax 技术和原理分析

    ajax所包含的技术 大家都知道ajax并非一种新的技术,而是几种原有技术的结合体.它由下列技术组合而成. 1.使用CSS和XHTML来表示. 2. 使用DOM模型来交互和动态显示. 3.使用XMLH ...

  7. ajax异步请求302分析

    1.前言 遇到这样一种情况,打开网页两个窗口a,b(都是已经登录授权的),在a页面中退出登录,然后在b页面执行增删改查,这个时候因为授权原因,b页面后端的请求肯定出现异常(对这个异常的处理,进行内部跳 ...

  8. Ajax跨越问题原因分析与解决思路

    1.什么是AJAX跨域问题 简单来说,就是前端调用后端服务接口时 如果服务接口不是同一个域,就会产生跨域问题 2.AJAX跨域场景 前后端分离.服务化的开发模式 前后端开发独立,前端需要大量调用后端接 ...

  9. 前后端交互之封装Ajax+SpringMVC源码分析

    为什么需要封装呢?因为用的多,我想将其封装成函数,当我想用它时,只需将那个函数对应的js文件引入即可,而不要重复写很多相同代码,利于开发效率的提高. 无论是$.ajax或$.post.$.get等,在 ...

随机推荐

  1. 【面试】惠普IT电面

    1.英文自我介绍 一定要事先准备,逻辑要清晰 2.英文项目介绍

  2. Pots

    poj3414:http://poj.org/problem?id=3414 题意:给你两个罐子的体积,然后让你只用这两个罐子量出给定k体积的水.题解:这里可以把两个罐子看成是一个二维的图,然后体积的 ...

  3. HDU 5478 Can you find it(数学问题)

    题目大意: 给你  ak1⋅n+b1+ bk2⋅n−k2+1 = 0 (mod C)(n = 1, 2, 3, ...). 要求所有的n都满足上述的式子. 问这样的a,b 有多少对?   分析这个问题 ...

  4. 2015第37周一struts2 jstl 标签

    1.在jstl中使用struts2  <c:forEach var="ee" items="${requestScope.serviceList}" &g ...

  5. 【树状数组】CSU 1811 Tree Intersection (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1811 题目大意: 一棵树,N(2<=N<=105)个节点,每个节点有一种颜 ...

  6. Java---实现运行任意目录下class中加了@MyTest的空参方法(实现图形界面)

    说明: 因为上个代码,总是要输入完整的绝对路径,比较麻烦,于是,就写了这个小程序,直接进入文件对话框选择需要运行的class文件. 只需要提前输入完整的类名. 注意:加的MyTest必须打个包,加上: ...

  7. 浅谈JavaScript函数

    JavaScript作为一种基于对象(非严格面向对象)的语言,函数在JS中的地位非同一般:用函数声明类和对象.甚至函数本身也是对象. 一.函数的三种声明方式辨析. 1.function命令 funct ...

  8. HDU 4118 树形DP Holiday's Accommodation

    题目链接:  HDU 4118 Holiday's Accommodation 分析: 可以知道每条边要走的次数刚好的是这条边两端的点数的最小值的两倍. 代码: #include<iostrea ...

  9. myeclipse 闪退解决方法

    今天提交一个svn文件发生卡死,然后关闭myeclipse后发生,打开myeclipse出险闪退,摸索半天,发现: 只要修改下工作空间的名称,然后打开myeclipse重新导入即可,只是之前的配置都没 ...

  10. C#实现文件数据库

    本文转载:http://www.cnblogs.com/gaochundong/archive/2013/04/24/csharp_file_database.html#commentform 本文为 ...