node package manager


Event emitter, but for hooks


Often event emitters are used not for sending signals to the outside world but as a general purpose hooking API. The difference is that hooks are known in advance, they are not specific to concrete instance. The natural thing to do for such cases is:

Widget.prototype.on('show', function() {
  // do something 

Obviously traditional event emitters do not allow that. They force you to do all subscriptions in constructor. That is

  • slow
  • inflexible (I think is a smell)

This project implements emitter in a different way. It allows you to add subscriptions on prototype and generally you should not think about clobbering or calls. At the moment of writing it can be used as a drop in replacement for component/emitter.

var Emitter = require('hooks-emitter')
var calls = []
var proto = new Emitter
proto.on('foo', function () {
var instance = Object.create(proto)
instance.on('foo', function () {
calls.should.eql(['proto', 'emitter'])
calls.should.eql(['proto', 'emitter', 'proto'])

Addition of handlers to prototype when child instance was already created is not supported. For such case behaviour is undefined.

var proto = new Emitter
var instance = Object.create(proto)
proto.on('foo', listener) // that's a bit funky 

Via npm

npm install hooks-emitter

Via component

component install eldargab/hooks-emitter

As an Emitter instance:

var Emitter = require('emitter');
var emitter = new Emitter;

As a mixin:

var Emitter = require('emitter');
var user = { name: 'tobi' };
user.emit('im a user');

Register an event handler fn.

Register a single-shot event handler fn, removed immediately after it is invoked the first time.

Remove event handler fn, or pass only the event name to remove all handlers for event.

Emit an event with variable option args.

Return an array of callbacks, or an empty array.

Check if this emitter has event handlers.