对ajax的hack的分析
先上原文链接:对jQuery ajax请求成功(失败)回调执行前的统一处理(兼容较老版本jQuery)
原文中已经提到了使用场景了,我觉得这非常适合单页面应用,还有backbone应用中。毕竟ajax回调成功了之后,不代表得到了正确的数据,比如没有登录,或者登录超时,这个时候应该跳转到登录页面。这种集中处理避免了在每个地方都要添加判断。
原文中主要有两处hack,一个是success回调;另一个是done回调;
对于success的hack我理解起来还比较轻松:
- 提供一个默认的success空函数。
- 如果有提供success回调,则覆盖那个空函数,也就是临时保存真正的回调函数。
- 利用$.extend方法覆盖opt中的success函数,在这个函数中首先做条件判断,其实就是自己的业务逻辑代码。在这里我们有控制权决定是否调用真实的success回调函数。
- 总结起来就是利用一个新的success函数代替真实的success函数,而新的success函数里面又会调用真实的success函数。
对于done的hack我一开始理解起来很吃力,感觉摸不着北。后来才想通了,这里其实最后hack的目标并不是done本身这个函数,而是hack了done的参数,也就是done的回调函数。
- 保存真实的
done方法。 - 重新定义
done函数,但是在这个函数中只有一行代码最重要:done.call(def, _done);。 - 可以发现虽然我们重新定义了
done方法,但是实际上内部代码只是简单的调用一下真实的done方法,只不过传递了一个函数参数_done。 - 这个函数参数
_done就变成了我们最终的回调函数了。其内部会调用到实际提供的回调函数func。 - 内部还有我们的业务代码,这样我们就有控制权决定是否调用真实的回调函数
func。 - 一开始我就理解错了,我以为我们hack的目标是
done函数,我们的业务代码也应该是写在新定义的done函数中,但是发现代码不是这样我就蒙圈里。 - 后来才明白实际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的分析的更多相关文章
- thinkphp中AJAX返回ajaxReturn()方法分析
本文分析了thinkphp中AJAX返回ajaxReturn()方法.分享给大家供大家参考,具体如下: 系统支持任何的AJAX类库,Action类提供了ajaxReturn方法用于AJAX调用后返回数 ...
- jQuery下ajax事件的简单分析
昨天写了一篇关于监视页面动态生成元素问题的文章,引起了一些小小的争议,不过我从中学到了很多.文章在这,<jQuery下实现等待指定元素加载完毕>当然 动态生成的节点元素 分很多种情况,这里 ...
- jquery中的$.ajax()的源码分析
针对获取到location.href的兼容代码: try { ajaxLocation = location.href; } catch( e ) { // Use the href attribut ...
- jQuery deferred应用之ajax详细源码分析(二)
在上一节中,我只贴出了$.Deferred的源码分析,并没用讲解怎么使用它,现在我们先看看$.ajax是如何使用它,让我们进行异步任务的处理. 如果没看上节的代码,请先稍微了解一下jQuery Def ...
- Ajax的js库分析简化版
Ajax jquery的库的简化版本 (function(){ //面向外界的唯一变量接口! var myajax = window.myajax = {}; //作者.版本号等等信 ...
- ajax 技术和原理分析
ajax所包含的技术 大家都知道ajax并非一种新的技术,而是几种原有技术的结合体.它由下列技术组合而成. 1.使用CSS和XHTML来表示. 2. 使用DOM模型来交互和动态显示. 3.使用XMLH ...
- ajax异步请求302分析
1.前言 遇到这样一种情况,打开网页两个窗口a,b(都是已经登录授权的),在a页面中退出登录,然后在b页面执行增删改查,这个时候因为授权原因,b页面后端的请求肯定出现异常(对这个异常的处理,进行内部跳 ...
- Ajax跨越问题原因分析与解决思路
1.什么是AJAX跨域问题 简单来说,就是前端调用后端服务接口时 如果服务接口不是同一个域,就会产生跨域问题 2.AJAX跨域场景 前后端分离.服务化的开发模式 前后端开发独立,前端需要大量调用后端接 ...
- 前后端交互之封装Ajax+SpringMVC源码分析
为什么需要封装呢?因为用的多,我想将其封装成函数,当我想用它时,只需将那个函数对应的js文件引入即可,而不要重复写很多相同代码,利于开发效率的提高. 无论是$.ajax或$.post.$.get等,在 ...
随机推荐
- cut 命令
今天看到cut拿来取参数也是很方便的. cut -d = -f 2 -d表示分隔符 -f参数是分隔符算第几个参数
- android.support.v7.widget.Toolbar 中menu图标不显示问题
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http:// ...
- qt实现头像上传功能(朝十晚八的博客,一堆帖子)
http://www.cnblogs.com/swarmbees/p/5688885.html
- 【POJ】3283 Card Hands
字典树. #include <iostream> #include <cstdio> #include <cstring> #include <string& ...
- bzoj1978
朴素的算法是O(n2logn)观察这个算法,似乎很难在进行优化我们就要换一种思路考虑到一个数的约数总不是很多,穷举约数也是可以在O(sqrt(x))的时间内完成的并且注意到,能否继续往下选数,只在于最 ...
- 「Poetize7」足球比赛
描述 Description SJZEZ和TSYZ正在进行一轮足球联谊赛,根据规则,这轮比赛有两场,一场在SJZEZ的主场进行,一场在TSYZ的主场进行.胜负判断标准如下:1.在两场比赛中进球总数较多 ...
- 【动态规划】Vijos P1143 三取方格数(NOIP2000提高组)
题目链接: https://vijos.org/p/1143 题目大意: NxN的矩阵,每个值只能取一次,从(1,1)走到(n,n)走三次能取得的最大值. 题目思路: [动态规划] f[x1][y1] ...
- 数据结构——N皇后放置方法种数
Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合 ...
- HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题
第一年参加现场赛,比赛的时候就A了这一道,基本全场都A的签到题竟然A不出来,结果题目重现的时候1A,好受打击 ORZ..... 题目链接:http://acm.hdu.edu.cn/showprobl ...
- Java 单元测试Junit
@Test @Before @After 测试方法运行前执行Before动作(比如创建资源),运行后执行After动作(比如销毁资源) @BeforeClass @AfterClass 测试类运行前执 ...