1
0
Fork 0
mirror of https://github.com/terribleplan/next.js.git synced 2024-01-19 02:48:18 +00:00

Make EventEmitter more Node-like (#4865)

Add behaviors to make `EventEmitter` a bit more like its NodeJS counterpart. This should make using it a bit less surprising.
This commit is contained in:
Jacob Page 2018-08-01 05:43:25 -07:00 committed by Tim Neutkens
parent 80202069cf
commit b492e6703d
2 changed files with 34 additions and 2 deletions

View file

@ -11,14 +11,22 @@ export default class EventEmitter {
}
this.listeners[event].add(cb)
return this
}
emit (event, ...data) {
if (!this.listeners[event]) return
this.listeners[event].forEach(cb => cb(...data)) // eslint-disable-line standard/no-callback-literal
const listeners = this.listeners[event]
const hasListeners = listeners && listeners.size
if (!hasListeners) {
return false
}
listeners.forEach(cb => cb(...data)) // eslint-disable-line standard/no-callback-literal
return true
}
off (event, cb) {
this.listeners[event].delete(cb)
return this
}
}

View file

@ -71,6 +71,30 @@ describe('EventEmitter', () => {
expect(run).toThrow(/The listener already exising in event: sample/)
})
it('should support chaining like the nodejs EventEmitter', () => {
const emitter = new EventEmitter()
let calledA = false
let calledB = false
emitter
.on('a', () => { calledA = true })
.on('b', () => { calledB = true })
emitter.emit('a')
emitter.emit('b')
expect(calledA).toEqual(true)
expect(calledB).toEqual(true)
})
it('should return an indication on emit if there were listeners', () => {
const emitter = new EventEmitter()
emitter.on('a', () => { })
expect(emitter.emit('a')).toEqual(true)
expect(emitter.emit('b')).toEqual(false)
})
})
describe('Without a listener', () => {