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 相关文章推荐
破除一些网站复制、右键限制
Nov 04 Javascript
使用Math.floor与Math.random取随机整数的方法详解
May 07 Javascript
js统计页面的来访次数实现代码
May 09 Javascript
javascript基于HTML5 canvas制作画箭头组件
Jun 25 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
Mar 21 jQuery
简单实现js点击展开二级菜单功能
May 16 Javascript
详解VUE中v-bind的基本用法
Jul 13 Javascript
理解javascript async的用法
Aug 22 Javascript
JavaScript学习笔记之函数记忆
Sep 06 Javascript
vue.js高德地图实现热点图代码实例
Apr 18 Javascript
jquery树形插件zTree高级使用详解
Aug 16 jQuery
Vue.use()在new Vue() 之前使用的原因浅析
Aug 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
PHP中实现进程间通讯
2006/10/09 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
JavaScript的Vue.js库入门学习教程
2016/05/23 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
利用python获得时间的实例说明
2013/03/25 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
会计学习心得体会
2014/09/09 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
公务员年度考核评语
2014/12/31 职场文书
葬礼主持词
2015/07/02 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
python删除csv文件的行列
2021/04/06 Python