Skip to content

Instantly share code, notes, and snippets.

@yuta0801
Created March 23, 2019 10:09
Show Gist options
  • Save yuta0801/fee28a9c5460a5bc2c08a805d5cb645e to your computer and use it in GitHub Desktop.
Save yuta0801/fee28a9c5460a5bc2c08a805d5cb645e to your computer and use it in GitHub Desktop.
Generatorify EventEmitter
// Referred to https://raw.githubusercontent.com/denoland/deno_std/v0.3.2/http/server.ts
function deferred() {
let resolve, reject
const promise = new Promise((res, rej) => {
resolve = res
reject = rej
})
return {
promise,
resolve,
reject
}
}
async function* listen(emitter, event) {
const env = {
queue: [],
deferred: deferred()
}
emitter.on(event, (...args) => {
env.queue.push(args)
env.deferred.resolve()
})
while (true) {
await env.deferred.promise
env.deferred = deferred()
const queueToProcess = env.queue
env.queue = []
for (const result of queueToProcess) {
yield result
env.deferred.resolve()
}
}
}
function generatorify(emitter) {
return event => listen(emitter, event)
}
module.exports = generatorify
const emitter = new (require('events'))
const generatorify = require('./generatorify')
// emitter.on('eventName', (arg1, arg2) => {
// console.log(arg1, arg2)
// })
!(async () => {
const listen = generatorify(emitter)
for await (const [arg1, arg2] of listen('eventName')) {
console.log(arg1, arg2)
}
})()
emitter.emit('eventName', 1, 2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment