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 相关文章推荐
在js中判断checkboxlist(.net控件客户端id)是否有选中
Apr 11 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
Jun 13 Javascript
JS 获取select(多选下拉)中所选值的示例代码
Aug 02 Javascript
jQuery操作Select的Option上下移动及移除添加等等
Nov 18 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
Javascript 多物体运动的实现
Dec 24 Javascript
jQuery选择器基础入门教程
May 10 Javascript
Axios学习笔记之使用方法教程
Jul 21 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
Dec 28 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
Mar 13 Javascript
vue路由中前进后退的一些事儿
May 18 Javascript
小程序封装路由文件和路由方法(5种全解析)
May 26 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
如何在PHP中生成随机数
2020/06/04 PHP
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
python求众数问题实例
2014/09/26 Python
python实现从字典中删除元素的方法
2015/05/04 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
Django权限机制实现代码详解
2018/02/05 Python
Linux下多个Python版本安装教程
2018/08/15 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
光声世纪笔试题目
2012/08/25 面试题
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
保安公司服务承诺书
2014/05/28 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
实习介绍信模板
2015/01/30 职场文书
供应商食品安全承诺书
2015/04/29 职场文书