Skip to content

Commit

Permalink
Deferred: Make jQuery.when synchronous when possible
Browse files Browse the repository at this point in the history
  • Loading branch information
gibson042 committed May 5, 2016
1 parent 7f2ebd2 commit bdb2af5
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
7 changes: 5 additions & 2 deletions src/deferred.js
Original file line number Diff line number Diff line change
Expand Up @@ -366,16 +366,19 @@ jQuery.extend( {

// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
adoptValue( singleValue, master.resolve, master.reject );
adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );

// Use .then() to unwrap secondary thenables (cf. gh-3000)
return master.then();
if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].then ) ) {
return master.then();
}
}

// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
}

return master.promise();
}
} );
Expand Down
21 changes: 21 additions & 0 deletions test/unit/deferred.js
Original file line number Diff line number Diff line change
Expand Up @@ -1049,3 +1049,24 @@ QUnit.test( "jQuery.when - notify does not affect resolved", function( assert )
assert.ok( false, "Error on resolve" );
} );
} );

QUnit.test( "jQuery.when(...) - opportunistically synchronous", function( assert ) {

assert.expect( 5 );

var when = "before",
resolved = jQuery.Deferred().resolve( true ),
rejected = jQuery.Deferred().reject( false ),
validate = function() {
assert.equal( when, "before" );
},
done = assert.async( 5 );

jQuery.when().done( validate ).always( done );
jQuery.when( when ).done( validate ).always( done );
jQuery.when( resolved ).done( validate ).always( done );
jQuery.when( rejected ).fail( validate ).always( done );
jQuery.when( resolved, rejected ).always( validate ).always( done );

when = "after";
} );

0 comments on commit bdb2af5

Please sign in to comment.