Simplified the way a Promise is tested for (removed promiseMarker). Removed isCancell...
authorjaubourg <j@ubourg.net>
Thu, 30 Dec 2010 16:06:53 +0000 (17:06 +0100)
committerjaubourg <j@ubourg.net>
Thu, 30 Dec 2010 16:06:53 +0000 (17:06 +0100)
src/core.js
test/unit/core.js

index 07666d9..95de5b9 100644 (file)
@@ -75,10 +75,7 @@ var jQuery = function( selector, context ) {
        indexOf = Array.prototype.indexOf,
        
        // [[Class]] -> type pairs
-       class2type = {},
-       
-       // Marker for deferred
-       promiseMarker = [];
+       class2type = {};
 
 jQuery.fn = jQuery.prototype = {
        init: function( selector, context ) {
@@ -874,7 +871,7 @@ jQuery.extend({
                                
                                // resolve with this as context and given arguments
                                resolve: function() {
-                                       deferred.fire( this , arguments );
+                                       deferred.fire( jQuery.isFunction( this.promise ) ? this.promise() : this , arguments );
                                        return this;
                                },
                                
@@ -888,11 +885,6 @@ jQuery.extend({
                                        cancelled = 1;
                                        callbacks = [];
                                        return this;
-                               },
-                               
-                               // Has this deferred been cancelled?
-                               isCancelled: function() {
-                                       return !!cancelled;
                                }
                        };
                
@@ -903,38 +895,36 @@ jQuery.extend({
        // Typical success/error system
        Deferred: function( func ) {
                
-               var errorDeferred = jQuery._Deferred(),
-                       deferred = jQuery._Deferred(),
-                       successCancel = deferred.cancel;
+               var deferred = jQuery._Deferred(),
+                       failDeferred = jQuery._Deferred();
                        
                // Add errorDeferred methods and redefine cancel                        
                jQuery.extend( deferred , {
 
-                               fail: errorDeferred.then,
-                               fireReject: errorDeferred.fire,
-                               reject: errorDeferred.resolve,
-                               isRejected: errorDeferred.isResolved,
+                               fail: failDeferred.then,
+                               fireReject: failDeferred.fire,
+                               reject: failDeferred.resolve,
+                               isRejected: failDeferred.isResolved,
                                // Get a promise for this deferred
                                // If obj is provided, the promise aspect is added to the object
                                promise: function( obj ) {
                                        obj = obj || {};
-                                       for ( var i in { then:1 , fail:1 , isResolved:1 , isRejected:1 , promise:1 } ) {
-                                               obj[ i ] = deferred[ i ];
-                                       }
+                                       jQuery.each( "then fail isResolved isRejected".split( " " ) , function( _ , method ) {
+                                               obj[ method ] = deferred[ method ];
+                                       });
+                                       obj.promise = function() {
+                                               return obj;
+                                       };
                                        return obj;
                                }
 
                } );
                
-               // Remove cancel related
-               delete deferred.cancel;
-               delete deferred.isCancelled;
-               
-               // Add promise marker
-               deferred.promise._ = promiseMarker;
-               
                // Make sure only one callback list will be used
-               deferred.then( errorDeferred.cancel ).fail( successCancel );
+               deferred.then( failDeferred.cancel ).fail( deferred.cancel );
+               
+               // Unexpose cancel
+               delete deferred.cancel;
                
                // Call given func if any
                if ( func ) {
@@ -946,7 +936,7 @@ jQuery.extend({
 
        // Deferred helper
        when: function( object ) {
-               object = object && object.promise && object.promise._ === promiseMarker ?
+               object = object && jQuery.isFunction( object.promise ) ?
                        object :
                        jQuery.Deferred().resolve( object );
                return object.promise();
index 1cd41a6..9367ab1 100644 (file)
@@ -1024,30 +1024,26 @@ test("jQuery.Deferred()", function() {
        
 test("jQuery.when()", function() {
        
-       expect( 14 );
-       
-       var fakeDeferred = { then: function() { return this; } };
-               
-       fakeDeferred.then._ = [];
+       expect( 21 );
        
        // Some other objects
        jQuery.each( {
                
-               "Object with then & no marker": { then: jQuery.noop },
-               "Object with then & marker": fakeDeferred,
-               "string 1/2": "",
-               "string 2/2": "some string",
-               "number 1/2": 0,
-               "number 2/2": 1,
-               "boolean 1/2": true,
-               "boolean 2/2": false,
+               "an empty string": "",
+               "a non-empty string": "some string",
+               "zero": 0,
+               "a number other than zero": 1,
+               "true": true,
+               "false": false,
                "null": null,
                "undefined": undefined,
-               "custom method name not found automagically": {custom: jQuery._Deferred().then}
+               "a plain object": {}
        
        } , function( message , value ) {
                
-               notStrictEqual( jQuery.when( value ) , value , message );
+               ok( jQuery.isFunction( jQuery.when( value ).then( function( resolveValue ) {
+                       strictEqual( resolveValue , value , "Test the promise was resolved with " + message );
+               } ).promise ) , "Test " + message + " triggers the creation of a new Promise" );
                
        } );