Skip to content

Commit 3663836

Browse files
committed
Refactors jQuery.when to avoid unnecessary recursion and limit function calls as much as possible.
1 parent cacea6f commit 3663836

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

src/core.js

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -905,13 +905,13 @@ jQuery.extend({
905905
}
906906
var i = promiseMethods.length;
907907
while( i-- ) {
908-
obj[ promiseMethods[ i ] ] = deferred[ promiseMethods[ i ] ];
908+
obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
909909
}
910910
return obj;
911911
}
912912
} );
913913
// Make sure only one callback list will be used
914-
deferred.then( failDeferred.cancel, deferred.cancel );
914+
deferred.done( failDeferred.cancel ).fail( deferred.cancel );
915915
// Unexpose cancel
916916
delete deferred.cancel;
917917
// Call given func if any
@@ -923,24 +923,34 @@ jQuery.extend({
923923

924924
// Deferred helper
925925
when: function( object ) {
926-
var args = arguments,
927-
length = args.length,
928-
deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ?
926+
var lastIndex = arguments.length,
927+
deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ?
929928
object :
930929
jQuery.Deferred(),
931-
promise = deferred.promise(),
932-
resolveArray;
933-
934-
if ( length > 1 ) {
935-
resolveArray = new Array( length );
936-
jQuery.each( args, function( index, element ) {
937-
jQuery.when( element ).then( function( value ) {
938-
resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
939-
if( ! --length ) {
940-
deferred.resolveWith( promise, resolveArray );
941-
}
942-
}, deferred.reject );
943-
} );
930+
promise = deferred.promise();
931+
932+
if ( lastIndex > 1 ) {
933+
var array = slice.call( arguments, 0 ),
934+
count = lastIndex,
935+
iCallback = function( index ) {
936+
return function( value ) {
937+
array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
938+
if ( !( --count ) ) {
939+
deferred.resolveWith( promise, array );
940+
}
941+
};
942+
};
943+
while( ( lastIndex-- ) ) {
944+
object = array[ lastIndex ];
945+
if ( object && jQuery.isFunction( object.promise ) ) {
946+
object.promise().then( iCallback(lastIndex), deferred.reject );
947+
} else {
948+
--count;
949+
}
950+
}
951+
if ( !count ) {
952+
deferred.resolveWith( promise, array );
953+
}
944954
} else if ( deferred !== object ) {
945955
deferred.resolve( object );
946956
}

0 commit comments

Comments
 (0)