/** * @fileoverview A set of helper functions to make it easier to work * with events in async/await manner. */ /** * @param {!EventTarget} target * @param {string} eventName * @return {!Promise} */ const waitForEvent = (target, eventName) => { return new Promise(resolve => { target.addEventListener(eventName, resolve, { once: true }); }); }; /** * @param {!EventEmitter} emitter * @param {string} eventName * @return {!Promise} With Event as the first item. */ const emittedOnce = (emitter, eventName) => { return emittedNTimes(emitter, eventName, 1).then(([result]) => result); }; const emittedNTimes = (emitter, eventName, times) => { const events = []; return new Promise(resolve => { const handler = (...args) => { events.push(args); if (events.length === times) { emitter.removeListener(eventName, handler); resolve(events); } }; emitter.on(eventName, handler); }); }; exports.emittedOnce = emittedOnce; exports.emittedNTimes = emittedNTimes; exports.waitForEvent = waitForEvent;