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事件列表解说
Dec 22 Javascript
解决jquery的datepicker的本地化以及Today问题
May 23 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
Feb 27 Javascript
JQUERY简单按钮轮换选中效果实现方法
May 07 Javascript
JavaScript 对象深入学习总结(经典)
Sep 29 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
Oct 13 Javascript
利用JavaScript如何查询某个值是否数组内
Jul 30 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
Apr 23 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 Javascript
JS 实现微信扫一扫功能
Sep 14 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
详解React中共享组件逻辑的三种方式
Feb 02 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安全性问题中的:Null 字符问题
2013/06/21 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
一段实时更新的时间代码
2006/07/07 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
javascript正则表达式总结
2016/02/29 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
windows下python安装pip图文教程
2018/05/25 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
python实现无边框进度条的实例代码
2020/12/30 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
节能宣传周活动总结
2014/05/08 职场文书
司法局火灾防控方案
2014/06/05 职场文书
工作收入证明模板
2015/06/12 职场文书
物资采购管理制度
2015/08/06 职场文书
2019 入党申请书范文
2019/07/10 职场文书