diff --git a/src/deferred.js b/src/deferred.js index 02f92b26c..5cc5fb5be 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -119,7 +119,7 @@ jQuery.extend({ if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); - if ( jQuery.isFunction( returned.promise ) ) { + if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject ); } else { newDefer[ action ]( returned ); diff --git a/test/unit/deferred.js b/test/unit/deferred.js index c71fbdbe7..89c9c612d 100644 --- a/test/unit/deferred.js +++ b/test/unit/deferred.js @@ -145,7 +145,7 @@ jQuery.each( [ "", " - new operator" ], function( _, withNew ) { test( "jQuery.Deferred.pipe - filtering (done)", function() { - expect(3); + expect(4); var defer = jQuery.Deferred(), piped = defer.pipe(function( a, b ) { @@ -173,11 +173,15 @@ test( "jQuery.Deferred.pipe - filtering (done)", function() { jQuery.Deferred().reject().pipe(function() { ok( false, "pipe should not be called on reject" ); }); + + jQuery.Deferred().resolve().pipe( jQuery.noop ).done(function( value ) { + strictEqual( value, undefined, "pipe done callback can return undefined/null" ); + }); }); test( "jQuery.Deferred.pipe - filtering (fail)", function() { - expect(3); + expect(4); var defer = jQuery.Deferred(), piped = defer.pipe( null, function( a, b ) { @@ -205,6 +209,10 @@ test( "jQuery.Deferred.pipe - filtering (fail)", function() { jQuery.Deferred().resolve().pipe( null, function() { ok( false, "pipe should not be called on resolve" ); } ); + + jQuery.Deferred().reject().pipe( null, jQuery.noop ).fail(function( value ) { + strictEqual( value, undefined, "pipe fail callback can return undefined/null" ); + }); }); test( "jQuery.Deferred.pipe - deferred (done)", function() {