Skip to content

Commit

Permalink
feat: add emitted helper
Browse files Browse the repository at this point in the history
  • Loading branch information
krmax44 committed Mar 20, 2021
1 parent 1648a8f commit 0dc216d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,15 @@ Unregister an event listener. Returns true on success and false when the event l
off(eventName, listener) => boolean
```
### `Houk.awaitEvent`
Returns a promise that will resolve, once the given event was triggered.
```ts
await houk.awaitEvent('myEvent');
console.log('myEvent was emitted');
```
### `Houk.emit`
Only available to deriving classes. Trigger all listeners of a particular event. `...args` will be passed along to the listeners.
Expand Down
27 changes: 27 additions & 0 deletions src/__tests__/emitted.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import Houk from '..';

describe('HoukClass', () => {
it('emits to listeners', async () => {
expect.assertions(2);

class Test extends Houk<{
event1: [something: number];
}> {
public fire(): void {
void this.emit('event1', 4);
}
}

let called = false;
const t = new Test();

const promise = t.awaitEvent('event1').then(() => {
called = true;
});
expect(called).toBe(false);
t.fire();

await promise;
expect(called).toBe(true);
});
});
12 changes: 12 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@ export default abstract class Houk<Events extends EventTypes> {
return this.getListeners(event).delete(fn);
}

/**
* Returns a promise that will resolve once the given event has been triggered.
* @param event The event name
*/
public async awaitEvent<EventName extends keyof Events>(
event: EventName
): Promise<void> {
return new Promise((resolve: () => void) => {
this.on(event, resolve, true);
});
}

/**
Emit an event to all listeners. Listeners will be called in the order of registration. All listeners run at once.abs
* @returns The promise will be resolved once all listener functions have returned a resolved promise.
Expand Down

0 comments on commit 0dc216d

Please sign in to comment.