aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Gibson <richard.gibson@gmail.com>2016-12-16 11:45:35 -0500
committerGitHub <noreply@github.com>2016-12-16 11:45:35 -0500
commit5d79c6466386862e70ce276a094c1897112b7491 (patch)
treee6035aed8f88d57bb0d0fefb5399aed926413d13
parent1777899a747647f3fa839eea4b0bb695d3b60f06 (diff)
downloadjquery-5d79c6466386862e70ce276a094c1897112b7491.tar.gz
jquery-5d79c6466386862e70ce276a094c1897112b7491.zip
Deferred: Stop inventing jQuery.when() resolution values
Fixes gh-3442 Closes gh-3445
-rw-r--r--src/deferred.js14
-rw-r--r--test/unit/deferred.js4
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" );
} );