Forward all subscribe arguments from Subscriber to EventEmitter

This commit is contained in:
Kevin Sawicki & Nathan Sobo 2013-05-16 13:36:51 -07:00
parent e2af4c964d
commit d76d0a030f
2 changed files with 19 additions and 3 deletions

View File

@ -1,9 +1,10 @@
Subscriber = require 'subscriber'
EventEmitter = require 'event-emitter'
_ = require 'underscore'
{$$} = require 'space-pen'
describe "Subscriber", ->
[emitter1, emitter2, event1Handler, event2Handler, subscriber] = []
[emitter1, emitter2, emitter3, event1Handler, event2Handler, event3Handler, subscriber] = []
class TestEventEmitter
_.extend TestEventEmitter.prototype, EventEmitter
@ -14,11 +15,17 @@ describe "Subscriber", ->
beforeEach ->
emitter1 = new TestEventEmitter
emitter2 = new TestEventEmitter
emitter3 = $$ ->
@div =>
@a()
@span()
subscriber = new TestSubscriber
event1Handler = jasmine.createSpy("event1Handler")
event2Handler = jasmine.createSpy("event2Handler")
event3Handler = jasmine.createSpy("event3Handler")
subscriber.subscribe emitter1, 'event1', event1Handler
subscriber.subscribe emitter2, 'event2', event2Handler
subscriber.subscribe emitter3, 'event3', 'a', event3Handler
it "subscribes to events on the specified object", ->
emitter1.trigger 'event1', 'foo'
@ -27,6 +34,12 @@ describe "Subscriber", ->
emitter2.trigger 'event2', 'bar'
expect(event2Handler).toHaveBeenCalledWith('bar')
emitter3.find('span').trigger 'event3'
expect(event3Handler).not.toHaveBeenCalledWith()
emitter3.find('a').trigger 'event3'
expect(event3Handler).toHaveBeenCalled()
it "allows an object to unsubscribe en-masse", ->
subscriber.unsubscribe()
emitter1.trigger 'event1', 'foo'

View File

@ -1,12 +1,15 @@
_ = require 'underscore'
module.exports =
subscribe: (eventEmitter, eventName, callback) ->
eventEmitter.on eventName, callback
subscribe: (eventEmitter, subscribeArgs...) ->
eventEmitter.on(subscribeArgs...)
@subscriptions ?= []
@subscriptionsByObject ?= new WeakMap
@subscriptionsByObject.set(eventEmitter, []) unless @subscriptionsByObject.has(eventEmitter)
eventName = _.first(subscribeArgs)
callback = _.last(subscribeArgs)
subscription = cancel: -> eventEmitter.off eventName, callback
@subscriptions.push(subscription)
@subscriptionsByObject.get(eventEmitter).push(subscription)