UNPKG

@exadel/esl

Version:

Exadel Smart Library (ESL) is the lightweight custom elements library that provide a set of super-flexible components

41 lines (40 loc) 1.78 kB
/** * @returns Promise that will be resolved by dispatching `event` on `target` * Or it will be rejected in `timeout` if it's specified * Optional `options` for addEventListener can be also specified */ export function promisifyEvent(target, event, timeout, options) { return new Promise((resolve, reject) => { const signal = options === null || options === void 0 ? void 0 : options.signal; if (signal === null || signal === void 0 ? void 0 : signal.aborted) return rejectOnSignal(); function eventCallback(e) { target.removeEventListener(event, eventCallback, options); e ? resolve(e) : reject(new Error('Rejected by timeout')); signalCallback(); } function signalCallback(e) { signal === null || signal === void 0 ? void 0 : signal.removeEventListener('abort', signalCallback); e && rejectOnSignal(); } function rejectOnSignal() { reject(new Error('Rejected by abort signal')); } target.addEventListener(event, eventCallback, options); if (typeof timeout === 'number' && timeout >= 0) { setTimeout(eventCallback, timeout); } signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', signalCallback); }); } /** * Short helper to make Promise from element state marker * @returns Promise that will be resolved if the target `marker` property is truthful or `event` is dispatched * @example * `const imgReady = promisifyMarker(eslImage, 'ready');` */ export function promisifyMarker(target, marker, event = marker) { if (target[marker]) return Promise.resolve(target); return promisifyEvent(target, event).then(() => target); }