jQuery的回调管理机制(三)
jQuery.when()方法是jQuery内部使用回调机制的范例。
// 参数为多个方法,这些方法全部执行完成之后执行回调
when: function( subordinate /* , ..., subordinateN */ ) {
var i = 0,
// 将传入的参数切成数组
resolveValues = core_slice.call( arguments ),
length = resolveValues.length,
// 未执行完成的方法 、
remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
// 当未执行完成的方法只剩一个时,生成deferred对象
deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
//
updateFunc = function( i, contexts, values ) {
return function( value ) {
contexts[ i ] = this;
values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
// 如果所有方法都正在执行
if( values === progressValues ) {
// 调用deferred对象的notifyWith方式,实际是就是调用Callback的fireWith方法,该方法会判断是将回调放入回到函数栈还是直接触发
deferred.notifyWith( contexts, values );
// 否则,如果全都执行完毕
} else if ( !( --remaining ) ) {
deferred.resolveWith( contexts, values );
}
};
},
progressValues, progressContexts, resolveContexts;
// 如果参数数量大于1
if ( length > 1 ) {
// 新建一个length长度等于参数数量的数组并复制给progressValues
progressValues = new Array( length );
// 新建一个length长度等于参数数量的数组并复制给progressContexts
progressContexts = new Array( length );
// 新建一个length长度等于参数数量的数组并复制给resolveContexts
resolveContexts = new Array( length );
for ( ; i < length; i++ ) {
// 如果存在第i个传入的方法,并且该方法有一个promise属性也是一个方法(说明该方法会返回一个promise对象)
if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
// 监控该方法是否完成,分别调用响应的回调函数
resolveValues[ i ].promise()
// 如果完成,则执行updateFunc方法
.done( updateFunc( i, resolveContexts, resolveValues ) )
// 如果失败,则直接标记deferred失败
.fail( deferred.reject )
// 如果正在执行,也调用updateFunc方法
.progress( updateFunc( i, progressContexts, progressValues ) );
} else {
// 如果不存在第i个方法,remaining减1
--remaining;
}
}
}
// 如果已经没有方法未执行完成,调用deferred的resolveWith方法
if ( !remaining ) {
deferred.resolveWith( resolveContexts, resolveValues );
}
// 返回deferred.promise方法(相当于提供了一个所有方法都执行完成的回调)
return deferred.promise();
}
jQuery的回调管理机制(三)的更多相关文章
- jQuery的回调管理机制(二)
jQuery.extend({ /* * deferred对象的一大好处,就是它允许你自由添加多个回调函数. * $.ajax("test.html") .done(func ...
- jQuery的回调管理机制
// 对option的一个缓存,避免每次都需要createOptions,option是创建Callback对象时的传入的参数// 每个option被存入optionsCache中类似于{memory ...
- NameNode元数据的管理机制(三)
元数据的管理: 第一步:客户端通过DistributedFilesystem 对象中的creat()方法来创建文件,此时,RPC会 通过一个RPC链接协议来调用namenode,并在命名空间中创建一个 ...
- 你必须了解的java内存管理机制(三)-垃圾标记
本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...
- mybatis深入理解(三)-----MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面.本文将讲述MyBatis的事务管理的实现机制.首先介绍MyBatis的事务Transaction的接口设计以及其不 ...
- ARC内存管理机制详解
ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...
- Linux中断管理 (1)Linux中断管理机制
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...
- Linux中断管理 (1)Linux中断管理机制【转】
转自:https://www.cnblogs.com/arnoldlu/p/8659981.html 目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机 ...
随机推荐
- 系列篇:Python3.x那些事儿
Python3.x那些事儿: http://jingyan.baidu.com/season/39306
- XCODE 添加不同IOS版本的模拟器
一.XCode->Preferences->Downloads, 可以下载模拟器.
- PHP 使用redis
<?php /*从平台获取数据库名*/ $dbname = ""; /*从环境变量里取host,port,user,pwd*/ $host = ''; $port = ''; ...
- Tomcat多站点部署方式
1.同一个Tomcat 同一个端口 部署多个项目 第一步:把待发布的多个项目.war文件放入tomcat的webapps文件下下 第二步:修改 $TOMCAT_HOME\conf 下的server.x ...
- 第二种方式,修改python unittest的执行顺序,使用猴子补丁
1.按照测试用例的上下顺序,而不是按方法的名称的字母顺序来执行测试用例. 之前的文章链接 python修改python unittest的运行顺序 之前写的,不是猴子补丁,而是要把Test用例的类名传 ...
- 爬豆瓣影评,记下解决maximum recursion depth exceeded in cmp
#主要是爬取后给别人做自然语言分析,没其他意思. #coding=utf8 import requests,re from lxml import etree import sys reload(sy ...
- 使用HttpClient访问url的工具类
maven依赖jar包配置: <dependency> <groupId>org.apache.httpcomponents</groupId> <artif ...
- spring + Mybatis + pageHelper + druid 整合源码分享
springMvc + spring + Mybatis + pageHelper + druid 整合 spring 和druid整合,spring 整合druid spring 和Mybatis ...
- /usr/bin/ld: cannot find -lxxx 的解决办法
/usr/bin/ld: cannot find -lxxx 的解决办法 在软件编译过程中,经常会碰到类似这样的编译错误: /usr/bin/ld: cannot find -lhdf5 这表示找不到 ...
- iOS开发--打印NSRange,CGRect等结构体
使用对应的转换NSStringFromCGPoint NSStringFromCGSize NSStringFromCGRect NSStringFromCGAffineTransform ...