You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.6 KiB
67 lines
1.6 KiB
function E () { |
|
// Keep this empty so it's easier to inherit from |
|
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) |
|
} |
|
|
|
E.prototype = { |
|
on: function (name, callback, ctx) { |
|
var e = this.e || (this.e = {}); |
|
|
|
(e[name] || (e[name] = [])).push({ |
|
fn: callback, |
|
ctx: ctx |
|
}); |
|
|
|
return this; |
|
}, |
|
|
|
once: function (name, callback, ctx) { |
|
var self = this; |
|
function listener () { |
|
self.off(name, listener); |
|
callback.apply(ctx, arguments); |
|
}; |
|
|
|
listener._ = callback |
|
return this.on(name, listener, ctx); |
|
}, |
|
|
|
emit: function (name) { |
|
var data = [].slice.call(arguments, 1); |
|
var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); |
|
var i = 0; |
|
var len = evtArr.length; |
|
|
|
for (i; i < len; i++) { |
|
evtArr[i].fn.apply(evtArr[i].ctx, data); |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
off: function (name, callback) { |
|
var e = this.e || (this.e = {}); |
|
var evts = e[name]; |
|
var liveEvents = []; |
|
|
|
if (evts && callback) { |
|
for (var i = 0, len = evts.length; i < len; i++) { |
|
if (evts[i].fn !== callback && evts[i].fn._ !== callback) |
|
liveEvents.push(evts[i]); |
|
} |
|
} |
|
|
|
// Remove event from queue to prevent memory leak |
|
// Suggested by https://github.com/lazd |
|
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 |
|
|
|
(liveEvents.length) |
|
? e[name] = liveEvents |
|
: delete e[name]; |
|
|
|
return this; |
|
} |
|
}; |
|
|
|
module.exports = E; |
|
module.exports.TinyEmitter = E;
|
|
|