Updating client-side PluginInterface to its server-side version
authorDarren <darren@darrenwhitlen.com>
Sat, 18 Oct 2014 01:30:48 +0000 (02:30 +0100)
committerDarren <darren@darrenwhitlen.com>
Sat, 18 Oct 2014 01:30:48 +0000 (02:30 +0100)
client/src/helpers/plugininterface.js

index ee025d9dbd118b24019f3e571c495bc5f63f6525..0c2782af9cbfd64f5833a96036603182bf42fc32 100644 (file)
@@ -52,31 +52,46 @@ PluginInterface.prototype.off = PluginInterface.prototype.removeListener = funct
 
 PluginInterface.prototype.emit = function emit(type, data) {
     var that = this;
+
     return new Promise(function (emit_resolve, emit_reject) {
         var rejected = false,
-            rejected_reasons = [];
+            rejected_reasons = [],
+            listeners_promise;
 
         if (!that.listeners[type]) {
             return emit_resolve(data);
         }
 
-        (that.listeners[type].reduce(function (listener_promise, listener) {
+        // Add each listener as a promise .then()
+        listeners_promise = that.listeners[type].reduce(function (listener_promise, listener) {
             return listener_promise.then(function (data) {
                 return new Promise(function (resolve) {
-                    listener({
+                    var event_data = {
                         callback: function () {
                             resolve(data);
+                            event_data.callback = null;
                         },
                         preventDefault: function (reason) {
                             rejected = true;
                             if (reason) {
                                 rejected_reasons.push(reason);
                             }
-                        }
-                    }, data);
+                        },
+                        wait: false
+                    };
+
+                    listener(event_data, data);
+
+                    // If the module has not specified that we should wait, callback now
+                    if (!event_data.wait && event_data.callback) {
+                        event_data.callback();
+                    }
                 });
             });
-        }, Promise.resolve(data))).then(function (data) {
+        }, Promise.resolve(data));
+
+        // After all the listeners have been called, resolve back with any modified data
+        listeners_promise.then(function (data) {
             if (rejected) {
                 emit_reject({data: data, reasons: rejected_reasons});
             } else {