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 hasOwnProperty 方法 & in 关键字
Nov 26 Javascript
iframe 自适应高度[在IE6 IE7 FF下测试通过]
Apr 13 Javascript
jquery last-child 列表最后一项的样式
Jan 22 Javascript
jquery 元素相对定位代码
Oct 15 Javascript
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
关于JS 预解释的相关理解
Jun 28 Javascript
JavaScript暂停和继续定时器的实现方法
Jul 18 Javascript
Angular学习笔记之angular的$filter服务浅析
Nov 12 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 Javascript
JS实现的JSON序列化操作简单示例
Jul 02 Javascript
超轻量级的js时间库miment使用解析
Aug 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和XSS跨站攻击的防范
2007/04/17 PHP
一步一步学习PHP(3) php 函数
2010/02/15 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
javascript multibox 全选
2009/03/22 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
通过示例彻底搞懂js闭包
2017/08/10 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
[52:40]完美世界DOTA2联赛PWL S2 Magma vs GXR 第一场 11.29
2020/12/02 DOTA
详解Python中的各种函数的使用
2015/05/24 Python
浅谈Python单向链表的实现
2015/12/24 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
Pycharm小白级简单使用教程
2020/01/08 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
师生聚会感言
2014/01/26 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
员工考勤管理制度
2015/08/06 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL
nginx安装以及配置的详细过程记录
2021/09/15 Servers
Python+tkinter实现高清图片保存
2022/03/13 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python