jquery 精巧的$.when 小记
2011-02-15 17:11
176 查看
[javascript]
// Deferred helper
when: function( object ) {
var args = arguments,
length = args.length,
deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ?
object :
jQuery.Deferred(),
promise = deferred.promise(),
resolveArray;
if ( length > 1 ) {
resolveArray = new Array( length );
jQuery.each( args, function( index, element ) {
jQuery.when( element ).then( function( value ) {
resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
if( ! --length ) {
deferred.resolveWith( promise, resolveArray );
}
}, deferred.reject );
} );
} else if ( deferred !== object ) {
deferred.resolve( object );
}
/*
分支#1: isResolve() = true length 递减
1: 默认如果没有返回promise,resolve触发,状态为isResolve() = true, length 递减 1
2:直接按返回romise,如果返回isResolve() = true, 执行then->done length 递减 1
分支#2: isReject()=true 执行then->fail
结果:递归最外层的deferred在跳出之前状态是isResolve() = false, isRejeced() = false
分支#2永远得不到执行的情况下,最终 isResolve() = true
如果分支#2被执行一次,分支#1中就少递减 1, isResolve() = false 就不会得到改变
因为只有每次都递减 1 最外层的 isResolve() = false 才能通过
deferred.resolveWith( promise, resolveArray );进行改变
最后 返回这个状态,供调用函数处理分支
*/
return promise;
},
[/javascript]
// Deferred helper
when: function( object ) {
var args = arguments,
length = args.length,
deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ?
object :
jQuery.Deferred(),
promise = deferred.promise(),
resolveArray;
if ( length > 1 ) {
resolveArray = new Array( length );
jQuery.each( args, function( index, element ) {
jQuery.when( element ).then( function( value ) {
resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
if( ! --length ) {
deferred.resolveWith( promise, resolveArray );
}
}, deferred.reject );
} );
} else if ( deferred !== object ) {
deferred.resolve( object );
}
/*
分支#1: isResolve() = true length 递减
1: 默认如果没有返回promise,resolve触发,状态为isResolve() = true, length 递减 1
2:直接按返回romise,如果返回isResolve() = true, 执行then->done length 递减 1
分支#2: isReject()=true 执行then->fail
结果:递归最外层的deferred在跳出之前状态是isResolve() = false, isRejeced() = false
分支#2永远得不到执行的情况下,最终 isResolve() = true
如果分支#2被执行一次,分支#1中就少递减 1, isResolve() = false 就不会得到改变
因为只有每次都递减 1 最外层的 isResolve() = false 才能通过
deferred.resolveWith( promise, resolveArray );进行改变
最后 返回这个状态,供调用函数处理分支
*/
return promise;
},
[/javascript]
相关文章推荐
- Jquery~$when_done_then的用法
- jquery when then(done) 用法举例
- Jquery字符串,数组(拷贝、删选、合并等),each循环,阻止冒泡,ajax出错,$.grep筛选,$.param序列化,$.when
- jquery中的 deferred之 when (三)
- jQuery Click fires twice when clicking on label
- jQuery的 $when()
- jquery源码之when
- 使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
- jQuery.when().done()
- jquery的when和Deferred方法
- Jquery字符串,数组(拷贝、删选、合并等),each循环,阻止冒泡,ajax出错,$.grep筛选,$.param序列化,$.when
- [Security] Automatically adding CSRF tokens to ajax calls when using jQuery--转
- 使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
- JQuery中的$.when()对象
- jquery 中的deffered和promise对象方法及$when done then的使用
- Use jQuery to hide a DIV when the user clicks outside of it
- jQuery.when()方法测试笔记及源码分析
- jQuery源代码学习之五——jQuery.when
- how to display a loading gif when using jquery ui dialog iframe
- 一周乱弹(1,js if(!param)判断,2,jquery发送多个ajax请求 $.when().then()3,清空表单)