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 相关文章推荐
拖动一个HTML元素
Dec 22 Javascript
扩展JavaScript功能的正确方法(译文)
Apr 12 Javascript
{}与function(){}选用空对象{}来存放keyValue
May 23 Javascript
jQuery插件实现大图全屏图片相册
Mar 14 Javascript
介绍JavaScript的一个微型模版
Jun 24 Javascript
Javascript 跨域知识详细介绍
Oct 30 Javascript
使用vux实现上拉刷新功能遇到的坑
Feb 08 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
May 23 Javascript
解决vue无法设置滚动位置的问题
Oct 07 Javascript
JavaScript设计模式之装饰者模式实例详解
Jan 17 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
JavaScript的Set数据结构详解
Feb 18 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
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
jqgrid 简单学习笔记
2011/05/03 Javascript
javascript中length属性的探索
2011/07/31 Javascript
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
python生成IP段的方法
2015/07/07 Python
python Celery定时任务的示例
2018/03/13 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
音乐表演专业毕业生求职信
2013/10/14 职场文书
班会关于环保演讲稿
2013/12/29 职场文书
物流专业自荐信
2014/05/23 职场文书
跳蚤市场口号
2014/06/13 职场文书
商场租赁意向书
2014/07/30 职场文书
融资合作协议书范本
2014/10/17 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书