Allow subscribers to unsubscribe on a per-object basis

This makes use of the new ES6 WeakMap feature, which allows for a hash
map that's keyed by object.
This commit is contained in:
Nathan Sobo
2013-04-21 18:50:08 -06:00
parent 93910201b0
commit 444325893b
3 changed files with 61 additions and 4 deletions

View File

@@ -1,13 +1,28 @@
_ = require 'underscore'
module.exports =
subscribe: (eventEmitter, eventName, callback) ->
eventEmitter.on eventName, callback
@subscriptions ?= []
@subscriptions.push(cancel: -> eventEmitter.off eventName, callback)
@subscriptionsByObject ?= new WeakMap
@subscriptionsByObject.set(eventEmitter, []) unless @subscriptionsByObject.has(eventEmitter)
subscription = cancel: -> eventEmitter.off eventName, callback
@subscriptions.push(subscription)
@subscriptionsByObject.get(eventEmitter).push(subscription)
subscribeToCommand: (view, eventName, callback) ->
view.command eventName, callback
@subscriptions ?= []
@subscriptions.push(cancel: -> view.off eventName, callback)
unsubscribe: ->
subscription.cancel() for subscription in @subscriptions ? []
unsubscribe: (object) ->
if object
for subscription in @subscriptionsByObject?.get(object) ? []
subscription.cancel()
_.remove(@subscriptions, subscription)
@subscriptionsByObject?.delete(object)
else
subscription.cancel() for subscription in @subscriptions ? []
@subscriptions = null
@subscriptionsByObject = null