From e44abcccc4ed864f4b23abcedea86d97edc945b2 2014-11-15 16:49:44
From: Jonathan Frederic <jon.freder@gmail.com>
Date: 2014-11-15 16:49:44
Subject: [PATCH] Promise logic is infectious like a disease

---

diff --git a/IPython/html/static/services/kernels/comm.js b/IPython/html/static/services/kernels/comm.js
index 7a9787c..1e73350 100644
--- a/IPython/html/static/services/kernels/comm.js
+++ b/IPython/html/static/services/kernels/comm.js
@@ -51,7 +51,7 @@ define([
     
     CommManager.prototype.register_comm = function (comm) {
         // Register a comm in the mapping
-        this.comms[comm.comm_id] = comm;
+        this.comms[comm.comm_id] = new Promise(function(resolve) {resolve(comm);});
         comm.kernel = this.kernel;
         return comm.comm_id;
     };
@@ -66,12 +66,13 @@ define([
     CommManager.prototype.comm_open = function (msg) {
         var content = msg.content;
         var that = this;
-        
-        return utils.load_class(content.target_name, content.target_module, 
+        var comm_id = content.comm_id;
+
+        this.comms[comm_id] = utils.load_class(content.target_name, content.target_module, 
             this.targets).then(function(target) {
 
-            var comm = new Comm(content.target_name, content.comm_id);
-            that.register_comm(comm);
+            var comm = new Comm(content.target_name, comm_id);
+            comm.kernel = that.kernel;
             try {
                 target(comm, msg);
             } catch (e) {
@@ -83,33 +84,40 @@ define([
             }
             return comm;
         }, utils.reject('Could not open comm', true));
+        return this.comms[comm_id];
     };
     
-    CommManager.prototype.comm_close = function (msg) {
+    CommManager.prototype.comm_close = function(msg) {
         var content = msg.content;
-        var comm = this.comms[content.comm_id];
-        if (comm === undefined) {
+        if (!this.comms[content.comm_id]) {
+            console.error('Comm promise not found for comm id ' + content.comm_id);
             return;
         }
-        this.unregister_comm(comm);
-        try {
-            comm.handle_close(msg);
-        } catch (e) {
-            console.log("Exception closing comm: ", e, e.stack, msg);
-        }
+
+        this.comms[content.comm_id].then(function(comm) {
+            this.unregister_comm(comm);
+            try {
+                comm.handle_close(msg);
+            } catch (e) {
+                console.log("Exception closing comm: ", e, e.stack, msg);
+            }
+        });
     };
     
-    CommManager.prototype.comm_msg = function (msg) {
+    CommManager.prototype.comm_msg = function(msg) {
         var content = msg.content;
-        var comm = this.comms[content.comm_id];
-        if (comm === undefined) {
+        if (!this.comms[content.comm_id]) {
+            console.error('Comm promise not found for comm id ' + content.comm_id);
             return;
         }
-        try {
-            comm.handle_msg(msg);
-        } catch (e) {
-            console.log("Exception handling comm msg: ", e, e.stack, msg);
-        }
+
+        this.comms[content.comm_id].then(function(comm) {
+            try {
+                comm.handle_msg(msg);
+            } catch (e) {
+                console.log("Exception handling comm msg: ", e, e.stack, msg);
+            }
+        });
     };
     
     //-----------------------------------------------------------------------
@@ -182,8 +190,9 @@ define([
     
     Comm.prototype.handle_msg = function (msg) {
         var that = this;
-        this.msg_promise.then(function() {
+        this.msg_promise = this.msg_promise.then(function() {
             that._maybe_callback('msg', msg);
+            return Promise.resolve();
         });
     };
     
diff --git a/IPython/html/tests/widgets/widget_float.js b/IPython/html/tests/widgets/widget_float.js
index 6b18dad..d253a80 100644
--- a/IPython/html/tests/widgets/widget_float.js
+++ b/IPython/html/tests/widgets/widget_float.js
@@ -26,9 +26,7 @@ casper.notebook_test(function () {
             'Widget float textbox exists.');
 
         this.cell_element_function(float_text.index, float_text.query, 'val', ['']);
-        console.log('send keys');
         this.sendKeys(float_text.query, '1.05');
-        console.log('send keys done');
     });
 
     this.wait_for_widget(float_text);