createEmitter.js

node v15.14.0
version: 0.0.1
endpointsharetweet
// https://gist.github.com/noseratio/0327f4a9e38301c6aa01b72f467ca9af async function main() { const emitter = createEmitter(); const start = Date.now(); setInterval(() => emitter.emit(Date.now() - start), 1000); for await (const item of emitter) { console.log(`tick: ${item}`); } } main().catch(e => console.warn(`caught on main: ${e.message}`)); function createEmitter() { const queue = []; let resolve; const push = p => { queue.push(p); if (resolve) { resolve(); resolve = null; } }; const emitError = e => push(Promise.reject(e)); return { emit: v => push(Promise.resolve(v)), throw: emitError, [Symbol.asyncIterator]: () => ({ next: async () => { while(!queue.length) { await new Promise((...a) => [resolve] = a); } return { value: await queue.pop(), done: false }; }, throw: emitError }) }; }
Loading…

no comments

    sign in to comment