@@ -71,9 +71,11 @@ jQuery.extend( {
7171 } ,
7272 then : function ( onFulfilled , onRejected , onProgress ) {
7373 var maxDepth = 0 ;
74- function resolve ( depth , deferred , handler , special ) {
74+ function resolve ( depth , deferred , callbacks , handler , special ) {
7575 return function ( ) {
76- var that = this ,
76+
77+ // Recover null/undefined context from global `this`
78+ var that = depth === 0 ? callbacks . context : this ,
7779 args = arguments ,
7880 mightThrow = function ( ) {
7981 var returned , then ;
@@ -113,8 +115,10 @@ jQuery.extend( {
113115 if ( special ) {
114116 then . call (
115117 returned ,
116- resolve ( maxDepth , deferred , Identity , special ) ,
117- resolve ( maxDepth , deferred , Thrower , special )
118+ resolve ( maxDepth , deferred , callbacks , Identity ,
119+ special ) ,
120+ resolve ( maxDepth , deferred , callbacks , Thrower ,
121+ special )
118122 ) ;
119123
120124 // Normal processors (resolve) also hook into progress
@@ -125,9 +129,11 @@ jQuery.extend( {
125129
126130 then . call (
127131 returned ,
128- resolve ( maxDepth , deferred , Identity , special ) ,
129- resolve ( maxDepth , deferred , Thrower , special ) ,
130- resolve ( maxDepth , deferred , Identity ,
132+ resolve ( maxDepth , deferred , callbacks , Identity ,
133+ special ) ,
134+ resolve ( maxDepth , deferred , callbacks , Thrower ,
135+ special ) ,
136+ resolve ( maxDepth , deferred , callbacks , Identity ,
131137 deferred . notify )
132138 ) ;
133139 }
@@ -203,6 +209,7 @@ jQuery.extend( {
203209 resolve (
204210 0 ,
205211 newDefer ,
212+ tuples [ 0 ] [ 3 ] ,
206213 jQuery . isFunction ( onProgress ) ?
207214 onProgress :
208215 Identity ,
@@ -215,6 +222,7 @@ jQuery.extend( {
215222 resolve (
216223 0 ,
217224 newDefer ,
225+ tuples [ 1 ] [ 3 ] ,
218226 jQuery . isFunction ( onFulfilled ) ?
219227 onFulfilled :
220228 Identity
@@ -226,6 +234,7 @@ jQuery.extend( {
226234 resolve (
227235 0 ,
228236 newDefer ,
237+ tuples [ 2 ] [ 3 ] ,
229238 jQuery . isFunction ( onRejected ) ?
230239 onRejected :
231240 Thrower
@@ -247,34 +256,39 @@ jQuery.extend( {
247256 var list = tuple [ 2 ] ,
248257 stateString = tuple [ 5 ] ;
249258
250- // promise.progress = list.add
251- // promise.done = list.add
252- // promise.fail = list.add
253- promise [ tuple [ 1 ] ] = list . add ;
259+ list . add ( function ( ) {
260+
261+ // Handle state
262+ if ( stateString ) {
254263
255- // Handle state
256- if ( stateString ) {
257- list . add (
258- function ( ) {
264+ // state = "resolved" (i.e., fulfilled)
265+ // state = "rejected"
266+ state = stateString ;
259267
260- // state = "resolved" (i.e., fulfilled)
261- // state = "rejected"
262- state = stateString ;
263- } ,
268+ // progress_callbacks.lock
269+ tuples [ 0 ] [ 2 ] . lock ( ) ;
264270
265271 // rejected_callbacks.disable
266272 // fulfilled_callbacks.disable
267- tuples [ 3 - i ] [ 2 ] . disable ,
273+ tuples [ 3 - i ] [ 2 ] . disable ( ) ;
274+ }
268275
269- // progress_callbacks.lock
270- tuples [ 0 ] [ 2 ] . lock
271- ) ;
272- }
276+ // Fire .then handlers, recovering null/undefined context from global `this`
277+ // progress_handlers.fire
278+ // fulfilled_handlers.fire
279+ // rejected_handlers.fire
280+ tuple [ 3 ] . fireWith ( list . context , arguments ) ;
281+ } ) ;
282+
283+ // promise.progress = list.add
284+ // promise.done = list.add
285+ // promise.fail = list.add
286+ promise [ tuple [ 1 ] ] = list . add ;
273287
274- // progress_handlers.fire
275- // fulfilled_handlers.fire
276- // rejected_handlers.fire
277- list . add ( tuple [ 3 ] . fire ) ;
288+ // deferred.notifyWith = list.fireWith
289+ // deferred.resolveWith = list.fireWith
290+ // deferred.rejectWith = list.fireWith
291+ deferred [ tuple [ 0 ] + "With" ] = list . fireWith ;
278292
279293 // deferred.notify = function() { deferred.notifyWith(...) }
280294 // deferred.resolve = function() { deferred.resolveWith(...) }
@@ -283,11 +297,6 @@ jQuery.extend( {
283297 deferred [ tuple [ 0 ] + "With" ] ( this === deferred ? undefined : this , arguments ) ;
284298 return this ;
285299 } ;
286-
287- // deferred.notifyWith = list.fireWith
288- // deferred.resolveWith = list.fireWith
289- // deferred.rejectWith = list.fireWith
290- deferred [ tuple [ 0 ] + "With" ] = list . fireWith ;
291300 } ) ;
292301
293302 // Make the deferred a promise
0 commit comments