aboutsummaryrefslogtreecommitdiffstats
path: root/src/deferred.js
diff options
context:
space:
mode:
authorjaubourg <j@ubourg.net>2012-05-12 21:41:39 +0200
committerjaubourg <j@ubourg.net>2012-05-12 21:41:39 +0200
commitf93a2f569d31c4d1fc86ff3ae9605309ac491d68 (patch)
tree0d93ddb310c38c7db3ce8a5d38cc4d97cdfa95ee /src/deferred.js
parentb6581df5de2083e322dcbede4dce74bacf93af5f (diff)
downloadjquery-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.js28
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();
}
});