tastypie
Version:
Tastypie is a webservice API framework for Node.js based on Django's Tastypie Framework. It provides a convenient, yet powerful and highly customizable, abstraction for creating REST-style interfaces
70 lines (52 loc) • 1.72 kB
JavaScript
/*
Emitter
*/"use strict"
var indexOf = require("mout/array/indexOf"),
forEach = require("mout/array/forEach")
var prime = require("./index"),
defer = require("./defer")
var slice = Array.prototype.slice;
var Emitter = prime({
constructor: function(stoppable){
this._stoppable = stoppable
},
on: function(event, fn){
var listeners = this._listeners || (this._listeners = {}),
events = listeners[event] || (listeners[event] = [])
if (indexOf(events, fn) === -1) events.push(fn)
return this
},
off: function(event, fn){
var listeners = this._listeners, events
if (listeners && (events = listeners[event])){
var io = indexOf(events, fn)
if (io > -1) events.splice(io, 1)
if (!events.length) delete listeners[event];
for (var l in listeners) return this
delete this._listeners
}
return this
},
emit: function(event){
var self = this,
args = slice.call(arguments, 1)
var emit = function(){
var listeners = self._listeners, events
if (listeners && (events = listeners[event])){
forEach(events.slice(0), function(event){
var result = event.apply(self, args)
if (self._stoppable) return result
})
}
}
if (args[args.length - 1] === Emitter.EMIT_SYNC){
args.pop()
emit()
} else {
defer(emit)
}
return this
}
})
Emitter.EMIT_SYNC = {}
module.exports = Emitter