From a41f2406748e3113751ab1e5b5d990d9144123fc Mon Sep 17 00:00:00 2001 From: jaubourg Date: Mon, 2 Apr 2012 01:29:39 +0200 Subject: Makes Deferred implementation truly Promise/A compliant. Unit tests amended. Actually few changes required in jQuery's own source and we gained 8 bytes minified gzipped \o/. --- src/ajax.js | 2 +- src/deferred.js | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/ajax.js b/src/ajax.js index 2bcc1d0a2..b241b257e 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -609,7 +609,7 @@ jQuery.extend({ } } else { tmp = map[ jqXHR.status ]; - jqXHR.then( tmp, tmp ); + jqXHR.always( tmp ); } } return this; diff --git a/src/deferred.js b/src/deferred.js index c97084b70..ddc324738 100644 --- a/src/deferred.js +++ b/src/deferred.js @@ -28,15 +28,11 @@ jQuery.extend({ isResolved: doneList.fired, isRejected: failList.fired, - then: function( doneCallbacks, failCallbacks, progressCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); - return this; - }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, - pipe: function( fnDone, fnFail, fnProgress ) { + then: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], @@ -50,7 +46,7 @@ jQuery.extend({ deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + returned.promise().done( newDefer.resolve ).fail( newDefer.reject ).progress( newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } @@ -74,9 +70,15 @@ jQuery.extend({ return obj; } }, - deferred = promise.promise({}), + deferred, key; + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Construct deferred + deferred = promise.promise({}); + for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; @@ -127,7 +129,7 @@ jQuery.extend({ if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + args[ i ].promise().done( resolveFunc(i) ).fail( deferred.reject ).progress( progressFunc(i) ); } else { --count; } -- cgit v1.2.3