diff options
author | jaubourg <j@ubourg.net> | 2012-05-12 21:41:39 +0200 |
---|---|---|
committer | jaubourg <j@ubourg.net> | 2012-05-12 21:41:39 +0200 |
commit | f93a2f569d31c4d1fc86ff3ae9605309ac491d68 (patch) | |
tree | 0d93ddb310c38c7db3ce8a5d38cc4d97cdfa95ee /src/deferred.js | |
parent | b6581df5de2083e322dcbede4dce74bacf93af5f (diff) | |
download | jquery-f93a2f569d31c4d1fc86ff3ae9605309ac491d68.tar.gz jquery-f93a2f569d31c4d1fc86ff3ae9605309ac491d68.zip |
Preserves context objects when multiple Deferreds are passed to $.when(). Context is an array containing the original contexts in order. When non-observable value is given, associated context is undefined. In case only a single non-observable value is given, context is the global object (thanks so much Function.prototype.apply!). Fixes #11749.
Diffstat (limited to 'src/deferred.js')
-rw-r--r-- | src/deferred.js | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/deferred.js b/src/deferred.js index a06fe2193..6c42583a5 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -97,35 +97,39 @@ jQuery.extend({ var i = 0, resolveValues = sliceDeferred.call( arguments ), length = resolveValues.length, - progressValues = new Array( length ), // the count of uncompleted subordinates remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, // the master Deferred. If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - promise = deferred.promise(), // Update function for both resolve and progress values - updateFunc = function( i, arr ) { + updateFunc = function( i, contexts, values ) { return function( value ) { - arr[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments ) : value; - if( arr === progressValues ) { - deferred.notifyWith( promise, arr ); + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); } else if ( !( --remaining ) ) { - deferred.resolveWith( promise, arr ); + deferred.resolveWith( contexts, values ); } }; - }; + }, + + progressValues, progressContexts, resolveContexts; // add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() - .done( updateFunc( i, resolveValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) .fail( deferred.reject ) - .progress( updateFunc( i, progressValues ) ); + .progress( updateFunc( i, progressContexts, progressValues ) ); } else { --remaining; } @@ -134,10 +138,10 @@ jQuery.extend({ // if we're not waiting on anything, resolve the master if ( !remaining ) { - deferred.resolveWith( deferred, resolveValues ); + deferred.resolveWith( resolveContexts, resolveValues ); } - return promise; + return deferred.promise(); } }); |