jQuery 源码分析笔记(3) Deferred机制


Posted in Javascript onJune 19, 2011

Deferred把回调函数注册到一个队列中,统一管理,并且可以同步或者异步地调用这些函数。
jQuery.Deferred()用来构造一个Deferred对象。该对象有状态值,共有三种: Rejected, Resolved和初始状态。其中Resolved表示该操作成功完成了,而Rejected 则表示出现了错误,调用失败。Deferred对象的主要成员如下:
done(callback): 注册一个callback函数,当状态为resolved时被调用。 * fail(callback): 注册一个callback函数,当状态为rejected时被调用。 * always(callback): 注册一个callback函数,无论是resolved或者rejected都会被调用。 * then(successCallback, failureCallback): 同时传入成功和失败的回调函数。 * pipe(successFilter, failureFilter): 在调用成功和失败的回调函数前先调用pipe 指定的函数。算是一种管道机制,拦截了函数调用。 * resolve(args): 把状态设置为Resolved。 * reject(args): 把状态设置为Rejected。 * promse(): 返回的是一个不完整的Deferred的接口,没有resolve和reject。即不能修改Deferred对象的状态。可以看作是一种只读视图。这是为了不让外部函数提早触发回调函数。比如$.ajax在1.5版本后不再返回XMLHttpRequest,而是返回一个封装了 XMLHttpRequest和Deferred对象接口的object。其中Deferred部分就是promise()得到的,这样不让外部函数调用resolve和reject,防止在ajax完成前触发回调函数。把这两个函数的调用权限保留给ajax内部。
这个模块的代码从939行开始,紧接着jQuery对象的声明。也算是一个基础核心代码了。同时也是1.5版本最大的变化之一。
实际上Resolve和Reject的代码逻辑是一样的,只是对应的状态不同而已。为了代码复用,内部先实现了一个Deferred,然后真正的Deferred内部new了两个Deferred,一个作为 Resolve,另一个作为Reject。
_Deferred对象内部维护了一个函数数组(callback list)。Done(f1, f2...)的工作就是把这些callback依次push到这个队列中保存下来。而resolveWith(带参的resolve)和resolve依次调用这写callback函数。
Done中,需要判断事件是否已经完成。如果callback加入chain时事件已经完成,则需要马上执行callback。这个特性是让callback不用再和触发异步事件声明写在一起的原因。比如原来必须写$.post("...", function(data) { ... })。这个success callback必须写在这里,而现在可以写:

var defer = $.post("..."); 
// ... 
defer.success(function(data) { 
// ... 
}); 
// ... 
defer.fail(function(data) { 
// ... 
});

这样异步事件的声明和回调函数就可以分别管理了。这是1.5版本重写后的最大变化。
pipe(successFilter, failureFilter)函数修改了原来对象中的callback list。在两个callback list前面用then函数分别插入了Filter函数。然后返回。这样当这个Deferred对象的状态变化时,会先调用pipe函数指定的Filter函数,然后才会调用callback list。
promise()则单纯许多,就是new一个新object,然后把需要的成员copy进去。这个需要的成员定义在一个叫promiseMethods常量中。
var promiseMethods = "done fail isResolved isRejected promise then always pipe".split(" ");
Javascript 相关文章推荐
javascript showModalDialog 内跳转页面的问题
Nov 25 Javascript
js验证整数加保留小数点的简单实例
Dec 02 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
基于jquery实现复选框全选,反选,全不选等功能
Oct 16 Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 Javascript
JS常用知识点整理
Jan 21 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
基于ES6作用域和解构赋值详解
Nov 03 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
JS实现倒序输出的几种常用方法示例
Apr 13 Javascript
Vue formData实现图片上传
Aug 20 Javascript
Node.js API详解之 vm模块用法实例分析
May 27 Javascript
jQuery 源码分析笔记(7) Queue
Jun 19 #Javascript
jQuery 源码分析笔记(5) jQuery.support
Jun 19 #Javascript
jQuery调用WebService的实现代码
Jun 19 #Javascript
非常棒的10款jQuery 幻灯片插件
Jun 14 #Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 #Javascript
jquery 与NVelocity 产生冲突的解决方法
Jun 13 #Javascript
用Juery网页选项卡实现代码
Jun 13 #Javascript
You might like
德劲1103的维修打理经验
2021/03/02 无线电
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
最常用的8款PHP调试工具
2014/07/06 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
深入浅析Python中的迭代器
2019/06/04 Python
Python 从attribute到property详解
2020/03/05 Python
高三自我鉴定怎么写
2013/10/19 职场文书
装修五一活动策划案
2014/01/23 职场文书
军训教官感言
2014/03/02 职场文书
希特勒的演讲稿
2014/05/23 职场文书
幼儿园安全生产月活动总结
2014/07/05 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
建设工程授权委托书
2014/09/22 职场文书
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL