diff --git a/spec/command-registry-spec.js b/spec/command-registry-spec.js index a0ac86c08..03ef0cc34 100644 --- a/spec/command-registry-spec.js +++ b/spec/command-registry-spec.js @@ -1,5 +1,6 @@ const CommandRegistry = require('../src/command-registry'); const _ = require('underscore-plus'); +const {it, fit, ffit, fffit, beforeEach, afterEach} = require('./async-spec-helpers'); describe("CommandRegistry", () => { let registry, parent, child, grandchild; @@ -357,12 +358,41 @@ describe("CommandRegistry", () => { expect(called).toBe(true); }); - it("returns a boolean indicating whether any listeners matched the command", () => { + it("returns a promise if any listeners matched the command", () => { registry.add('.grandchild', 'command', () => {}); - expect(registry.dispatch(grandchild, 'command')).toBe(true); - expect(registry.dispatch(grandchild, 'bogus')).toBe(false); - expect(registry.dispatch(parent, 'command')).toBe(false); + expect(registry.dispatch(grandchild, 'command').constructor.name).toBe("Promise"); + expect(registry.dispatch(grandchild, 'bogus')).toBe(null); + expect(registry.dispatch(parent, 'command')).toBe(null); + }); + + it("returns a promise that resolves when the listeners resolve", async () => { + jasmine.useRealClock(); + registry.add('.grandchild', 'command', () => 1); + registry.add('.grandchild', 'command', () => Promise.resolve(2)); + registry.add('.grandchild', 'command', () => new Promise((resolve) => { + setTimeout(() => { resolve(3); }, 1); + })); + + const values = await registry.dispatch(grandchild, 'command'); + expect(values).toEqual([3, 2, 1]); + }); + + it("returns a promise that rejects when a listener is rejected", async () => { + jasmine.useRealClock(); + registry.add('.grandchild', 'command', () => 1); + registry.add('.grandchild', 'command', () => Promise.resolve(2)); + registry.add('.grandchild', 'command', () => new Promise((resolve, reject) => { + setTimeout(() => { reject(3); }, 1); + })); + + let value; + try { + value = await registry.dispatch(grandchild, 'command'); + } catch (err) { + value = err; + } + expect(value).toBe(3); }); }); diff --git a/src/command-registry.js b/src/command-registry.js index 9e6d8c2e1..e503691db 100644 --- a/src/command-registry.js +++ b/src/command-registry.js @@ -309,7 +309,7 @@ module.exports = class CommandRegistry { handleCommandEvent (event) { let propagationStopped = false let immediatePropagationStopped = false - let matched = false + let matched = [] let currentTarget = event.target const dispatchedEvent = new CustomEvent(event.type, { @@ -373,10 +373,6 @@ module.exports = class CommandRegistry { listeners = selectorBasedListeners.concat(listeners) } - if (listeners.length > 0) { - matched = true - } - // Call inline listeners first in reverse registration order, // and selector-based listeners by specificity and reverse // registration order. @@ -385,7 +381,7 @@ module.exports = class CommandRegistry { if (immediatePropagationStopped) { break } - listener.didDispatch.call(currentTarget, dispatchedEvent) + matched.push(listener.didDispatch.call(currentTarget, dispatchedEvent)) } if (currentTarget === window) { @@ -399,7 +395,7 @@ module.exports = class CommandRegistry { this.emitter.emit('did-dispatch', dispatchedEvent) - return matched + return (matched.length > 0 ? Promise.all(matched) : null) } commandRegistered (commandName) {