Deferred: add .catch handler

Fixes gh-2102
This commit is contained in:
Timmy Willison 2015-07-06 10:13:01 -04:00
parent 5895340088
commit ef77f83db8
2 changed files with 39 additions and 0 deletions

View File

@ -33,6 +33,9 @@ jQuery.extend({
deferred.done( arguments ).fail( arguments ); deferred.done( arguments ).fail( arguments );
return this; return this;
}, },
"catch": function( fn ) {
return promise.then( null, fn );
},
// Keep pipe for back-compat // Keep pipe for back-compat
pipe: function( /* fnDone, fnFail, fnProgress */ ) { pipe: function( /* fnDone, fnFail, fnProgress */ ) {
var fns = arguments; var fns = arguments;

View File

@ -167,6 +167,42 @@ test( "jQuery.Deferred.then - filtering (fail)", function( assert ) {
}); });
}); });
test( "jQuery.Deferred.catch", function( assert ) {
assert.expect( 4 );
var value1, value2, value3,
defer = jQuery.Deferred(),
piped = defer.catch(function( a, b ) {
return a * b;
}),
done = jQuery.map( new Array( 3 ), function() { return assert.async(); } );
piped.done(function( result ) {
value3 = result;
});
defer.fail(function( a, b ) {
value1 = a;
value2 = b;
});
defer.reject( 2, 3 ).catch(function() {
assert.strictEqual( value1, 2, "first reject value ok" );
assert.strictEqual( value2, 3, "second reject value ok" );
assert.strictEqual( value3, 6, "result of filter ok" );
done.pop().call();
});
jQuery.Deferred().resolve().catch(function() {
assert.ok( false, "then should not be called on resolve" );
}).then( done.pop() );
jQuery.Deferred().reject().catch( jQuery.noop ).done(function( value ) {
assert.strictEqual( value, undefined, "then fail callback can return undefined/null" );
done.pop().call();
});
});
test( "[PIPE ONLY] jQuery.Deferred.pipe - filtering (fail)", function( assert ) { test( "[PIPE ONLY] jQuery.Deferred.pipe - filtering (fail)", function( assert ) {
assert.expect( 4 ); assert.expect( 4 );