X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=d77c818e63131af78aa55460714a19eadedcaa08;hb=3663836b0180f3a73d96ec234d5d7010e5652a4b;hp=586e372de5edf029e392975a41d2e5eee30aceff;hpb=6b08d88d04f4a41849753999e6e18126895086d0;p=jquery.git diff --git a/src/core.js b/src/core.js index 586e372..d77c818 100644 --- a/src/core.js +++ b/src/core.js @@ -56,16 +56,8 @@ var jQuery = function( selector, context ) { // The deferred used on DOM ready readyList, - // Promise methods (with equivalent for invert) - promiseMethods = { - then: 0, // will be overwritten for invert - done: "fail", - fail: "done", - isResolved: "isRejected", - isRejected: "isResolved", - promise: "invert", - invert: "promise" - }, + // Promise methods + promiseMethods = "then done fail isResolved isRejected promise".split( " " ), // The ready event handler DOMContentLoaded, @@ -851,6 +843,12 @@ jQuery.extend({ callbacks.shift().apply( context, args ); } } + // We have to add a catch block for + // IE prior to 8 or else the finally + // block will never get executed + catch (e) { + throw e; + } finally { fired = [ context, args ]; firing = 0; @@ -885,9 +883,8 @@ jQuery.extend({ Deferred: function( func ) { var deferred = jQuery._Deferred(), failDeferred = jQuery._Deferred(), - promise, - invert; - // Add errorDeferred methods, then, promise and invert + promise; + // Add errorDeferred methods, then and promise jQuery.extend( deferred, { then: function( doneCallbacks, failCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ); @@ -906,32 +903,15 @@ jQuery.extend({ } promise = obj = {}; } - for( var methodName in promiseMethods ) { - obj[ methodName ] = deferred[ methodName ]; + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; } return obj; - }, - // Get the invert promise for this deferred - // If obj is provided, the invert promise aspect is added to the object - invert: function( obj ) { - if ( obj == null ) { - if ( invert ) { - return invert; - } - invert = obj = {}; - } - for( var methodName in promiseMethods ) { - obj[ methodName ] = promiseMethods[ methodName ] && deferred[ promiseMethods[methodName] ]; - } - obj.then = invert.then || function( doneCallbacks, failCallbacks ) { - deferred.done( failCallbacks ).fail( doneCallbacks ); - return this; - }; - return obj; } } ); // Make sure only one callback list will be used - deferred.then( failDeferred.cancel, deferred.cancel ); + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); // Unexpose cancel delete deferred.cancel; // Call given func if any @@ -943,24 +923,34 @@ jQuery.extend({ // Deferred helper when: function( object ) { - var args = arguments, - length = args.length, - deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ? + var lastIndex = arguments.length, + deferred = lastIndex <= 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 ) { - jQuery.when( element ).then( function( value ) { - resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; - if( ! --length ) { - deferred.resolveWith( promise, resolveArray ); - } - }, deferred.reject ); - } ); + promise = deferred.promise(); + + if ( lastIndex > 1 ) { + var array = slice.call( arguments, 0 ), + count = lastIndex, + iCallback = function( index ) { + return function( value ) { + array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( promise, array ); + } + }; + }; + while( ( lastIndex-- ) ) { + object = array[ lastIndex ]; + if ( object && jQuery.isFunction( object.promise ) ) { + object.promise().then( iCallback(lastIndex), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( promise, array ); + } } else if ( deferred !== object ) { deferred.resolve( object ); }