diff options
author | Richard Gibson <richard.gibson@gmail.com> | 2016-12-16 11:45:35 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-16 11:45:35 -0500 |
commit | 5d79c6466386862e70ce276a094c1897112b7491 (patch) | |
tree | e6035aed8f88d57bb0d0fefb5399aed926413d13 | |
parent | 1777899a747647f3fa839eea4b0bb695d3b60f06 (diff) | |
download | jquery-5d79c6466386862e70ce276a094c1897112b7491.tar.gz jquery-5d79c6466386862e70ce276a094c1897112b7491.zip |
Deferred: Stop inventing jQuery.when() resolution values
Fixes gh-3442
Closes gh-3445
-rw-r--r-- | src/deferred.js | 14 | ||||
-rw-r--r-- | test/unit/deferred.js | 4 |
2 files changed, 10 insertions, 8 deletions
diff --git a/src/deferred.js b/src/deferred.js index 8139515fe..7e2ced25b 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -13,7 +13,7 @@ function Thrower( ex ) { throw ex; } -function adoptValue( value, resolve, reject ) { +function adoptValue( value, resolve, reject, noValue ) { var method; try { @@ -29,9 +29,10 @@ function adoptValue( value, resolve, reject ) { // Other non-thenables } else { - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - resolve.call( undefined, value ); + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); } // For Promises/A+, convert exceptions into rejections @@ -41,7 +42,7 @@ function adoptValue( value, resolve, reject ) { // Support: Android 4.0 only // Strict mode functions invoked without .call/.apply get global-object context - reject.call( undefined, value ); + reject.apply( undefined, [ value ] ); } } @@ -366,7 +367,8 @@ jQuery.extend( { // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject ); + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || diff --git a/test/unit/deferred.js b/test/unit/deferred.js index 32f325681..426af4b5f 100644 --- a/test/unit/deferred.js +++ b/test/unit/deferred.js @@ -814,11 +814,11 @@ QUnit.test( "jQuery.when(nonThenable) - like Promise.resolve", function( assert jQuery.when() .done( function( resolveValue ) { - assert.strictEqual( resolveValue, undefined, "Resolved .done with no arguments" ); + assert.strictEqual( arguments.length, 0, "Resolved .done with no arguments" ); assert.strictEqual( this, defaultContext, "Default .done context with no arguments" ); } ) .then( function( resolveValue ) { - assert.strictEqual( resolveValue, undefined, "Resolved .then with no arguments" ); + assert.strictEqual( arguments.length, 0, "Resolved .then with no arguments" ); assert.strictEqual( this, defaultContext, "Default .then context with no arguments" ); } ); |