Skip to content
Permalink
Browse files

Deferred: Stop inventing jQuery.when() resolution values

Fixes gh-3442
Closes gh-3445
  • Loading branch information...
gibson042 committed Dec 16, 2016
1 parent 1777899 commit 5d79c6466386862e70ce276a094c1897112b7491
Showing with 10 additions and 8 deletions.
  1. +8 −6 src/deferred.js
  2. +2 −2 test/unit/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" ||
@@ -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" );
} );

0 comments on commit 5d79c64

Please sign in to comment.
You can’t perform that action at this time.