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 相关文章推荐
对google个性主页的拖拽效果的js的完整注释[转]
Apr 10 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
Apr 13 Javascript
bootstrap表单示例代码分享
May 18 Javascript
vue脚手架vue-cli的学习使用教程
Jun 06 Javascript
JS运动特效之完美运动框架实例分析
Jan 24 Javascript
在Vue中使用echarts的方法
Feb 05 Javascript
nginx+vue.js实现前后端分离的示例代码
Feb 12 Javascript
小程序图片长按识别功能的实现方法
Aug 30 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
Mar 22 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
Mar 29 Javascript
Vue搭建后台系统需要注意的问题
Nov 08 Javascript
vue/cli 配置动态代理无需重启服务的方法
May 20 Vue.js
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
一个用php3编写的简单计数器
2006/10/09 PHP
php提取微信账单的有效信息
2018/10/01 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
修改file按钮的默认样式实现代码
2013/04/23 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
解释&&和||在javascript中的另类用法
2014/07/28 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python数据归一化及三种方法详解
2019/08/06 Python
python  logging日志打印过程解析
2019/10/22 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
维也纳通行证:Vienna PASS
2019/07/18 全球购物
介绍一下linux的文件系统
2015/10/06 面试题
JAVA中运算符的分类及举例
2015/09/12 面试题
英文版银行求职信
2013/10/09 职场文书
教育孩子心得体会
2014/01/01 职场文书
简历里的自我评价
2014/01/31 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
鲁迅故里导游词
2015/02/05 职场文书
2015年林业工作总结
2015/05/14 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
python常见的占位符总结及用法
2021/07/02 Python