implement FutureResolver.resolve
authorLuc Yriarte <luc.yriarte@intel.com>
Thu, 23 May 2013 14:45:14 +0000 (16:45 +0200)
committerLuc Yriarte <luc.yriarte@intel.com>
Thu, 23 May 2013 14:45:14 +0000 (16:45 +0200)
cloudeebus/cloudeebus.js

index 847b552..3293e83 100644 (file)
@@ -181,12 +181,24 @@ cloudeebus.FutureResolver.prototype.resolve = function(value, sync) {
        if (this.resolved)
                return;
        
-       try {
-               this.accept(value, sync);
-       }
-       catch (e) {
-               this.reject(e, sync);
+       var then = (value && value.then && value.then.apply) ? value.then : null;
+       if (then) {
+               var self = this;                
+               var acceptCallback = function(arg) {
+                       self.accept(arg, true);
+               };      
+               var rejectCallback = function(arg) {
+                       self.reject(arg, true);
+               };
+               try {
+                       then.apply(value, [acceptCallback, rejectCallback]);
+               }
+               catch (e) {
+                       this.reject(e, true);
+               }
        }
+       
+       this.accept(value, sync);
 };
 
 
@@ -262,7 +274,7 @@ cloudeebus.Future.prototype.then = function(acceptCB, rejectCB) {
                acceptWrapper = function(arg) {
                        try {
                                var value = acceptCB.apply(future, [arg]);
-                               resolver.accept(value, true);
+                               resolver.resolve(value, true);
                        }
                        catch (e) {
                                resolver.reject(e, true);
@@ -277,7 +289,7 @@ cloudeebus.Future.prototype.then = function(acceptCB, rejectCB) {
                rejectWrapper = function(arg) {
                        try {
                                var value = rejectCB.apply(future, [arg]);
-                               resolver.reject(value, true);
+                               resolver.resolve(value, true);
                        }
                        catch (e) {
                                resolver.reject(e, true);