Skip to content

Commit 1e264c1

Browse files
committed
feat(core events): Add await_event for using await statements to wait for an event to happen.
1 parent 1028a6d commit 1e264c1

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/core/events.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,25 @@ const remove_event_listener = (el, id) => {
5858
}
5959
};
6060

61+
/**
62+
* Await an event to be thrown.
63+
*
64+
* Usage:
65+
* await events.await_event(button, "click");
66+
*
67+
* @param {DOM Node} el - The element to listen on.
68+
* @param {String} event_name - The event name to listen for.
69+
*
70+
* @returns {Promise} - Returns a Promise which can be used for ``await`` and which will be resolved when the event is throwm.
71+
*
72+
*/
73+
const await_event = (el, event_name) => {
74+
// See: https://stackoverflow.com/a/44746691/1337474
75+
return new Promise((resolve) =>
76+
el.addEventListener(event_name, resolve, { once: true })
77+
);
78+
};
79+
6180
/**
6281
* Event factories
6382
*/
@@ -100,6 +119,7 @@ const submit_event = () => {
100119
export default {
101120
add_event_listener: add_event_listener,
102121
remove_event_listener: remove_event_listener,
122+
await_event: await_event,
103123
click_event: click_event,
104124
change_event: change_event,
105125
input_event: input_event,

src/core/events.test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,19 @@ describe("core.events tests", () => {
4747

4848
done();
4949
});
50+
51+
it("Awaits an event to happen", async () => {
52+
const el = document.createElement("div");
53+
54+
window.setTimeout(() => {
55+
el.dispatchEvent(new Event("init"));
56+
}, 1);
57+
58+
await events.await_event(el, "init");
59+
60+
// If test reaches this expect statement, all is fine.
61+
expect(true).toBe(true);
62+
});
5063
});
5164

5265
describe("2 - event factories", () => {

0 commit comments

Comments
 (0)