// 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
})
};
}