X-Git-Url: http://git.asbjorn.biz/?p=jquery.git;a=blobdiff_plain;f=src%2Fcore.js;h=25ef22d765e58bc28eef95adc9de6742699d6649;hp=0bf0cb4b7125c69243460b2d48c4cba4f45f6bf9;hb=c272f5f7da3473fd5ac85efe783a0d63608ec62b;hpb=cfca6d3836476a233cf349abc5f433f1ba7b8feb diff --git a/src/core.js b/src/core.js index 0bf0cb4..25ef22d 100644 --- a/src/core.js +++ b/src/core.js @@ -898,9 +898,10 @@ jQuery.extend({ Deferred: function( func ) { var deferred = jQuery._Deferred(), - failDeferred = jQuery._Deferred(); + failDeferred = jQuery._Deferred(), + promise; - // Add errorDeferred methods and redefine cancel + // Add errorDeferred methods, then and promise jQuery.extend( deferred , { then: function( doneCallbacks , failCallbacks ) { @@ -914,13 +915,15 @@ jQuery.extend({ // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { - obj = obj || {}; - jQuery.each( "then done fail isResolved isRejected".split( " " ) , function( _ , method ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + jQuery.each( "then done fail isResolved isRejected promise".split( " " ) , function( _ , method ) { obj[ method ] = deferred[ method ]; }); - obj.promise = function() { - return obj; - }; return obj; } @@ -942,10 +945,32 @@ jQuery.extend({ // Deferred helper when: function( object ) { - object = object && jQuery.isFunction( object.promise ) ? - object : - jQuery.Deferred().resolve( object ); - return object.promise(); + var args = arguments, + length = args.length, + deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ? + object : + jQuery.Deferred(), + promise = deferred.promise(), + resolveArray; + + if ( length > 1 ) { + resolveArray = new Array( length ); + jQuery.each( args, function( index, element, args ) { + jQuery.when( element ).done( function( value ) { + args = arguments; + resolveArray[ index ] = args.length > 1 ? slice.call( args , 0 ) : value; + if( ! --length ) { + deferred.fire( promise, resolveArray ); + } + }).fail( function() { + deferred.fireReject( promise, arguments ); + }); + return !deferred.isRejected(); + }); + } else if ( deferred !== object ) { + deferred.resolve( object ); + } + return promise; }, // Use of jQuery.browser is frowned upon.