eventric
Version:
Build JavaScript applications with Behaviour-driven Domain Design. Based on DDD, BDD, CQRS and EventSourcing.
70 lines (52 loc) • 1.76 kB
text/coffeescript
class PubSub
constructor: ->
= []
= 0
= (args...) -> setTimeout args...
subscribe: (eventName, subscriberFn) ->
subscriber =
eventName: eventName
subscriberFn: subscriberFn
subscriberId:
.push subscriber
subscriber.subscriberId
subscribeAsync: (eventName, subscriberFn) ->
subscriber =
eventName: eventName
subscriberFn: subscriberFn
subscriberId:
isAsync: true
.push subscriber
subscriber.subscriberId
publish: (eventName, payload, callback = ->) ->
subscribers = eventName
executeNextHandler = =>
if subscribers.length is 0
callback()
else
subscribers.shift().subscriberFn payload, ->
executeNextHandler, 0
executeNextHandler, 0
publishAsync: (eventName, payload, callback = ->) ->
subscribers = eventName
executeNextHandler = =>
if subscribers.length is 0
callback()
else
subscriber = subscribers.shift()
if subscriber.isAsync
subscriber.subscriberFn payload, -> setTimeout executeNextHandler, 0
else
subscriber.subscriberFn payload
executeNextHandler, 0
executeNextHandler, 0
_getRelevantSubscribers: (eventName) ->
if eventName
.filter (x) -> x.eventName is eventName
else
unsubscribe: (subscriberId) ->
= .filter (x) -> x.subscriberId isnt subscriberId
_getNextSubscriberId: ->
++
module.exports = PubSub