3

我写了很多小库和模块,通常这些库和模块都有一些与之相关的事件。到目前为止,我一直在写这些(缩短了很多):

Library.prototype.on = function(event, callback){
  self = this;
  self.events[event] = callback;
}

然后用户会做一些事情,比如:

Library.on('foo',function(){
  console.log('bar');
});

有没有更好的性能更高的方法来做到这一点,或者这是实现这一点的标准方法?我想要一个可以放入任何 JS 项目的简单 API 来支持这种行为。

4

2 回答 2

2
var EventEmitter = {
    constructor: function _constructor() {
        this._events = [];
        return this;
    },
    on: function _on(ev, handler) {
        if (!this._events[ev]) {
            this._events[ev] = [];
        }
        this._events[ev].push(handler);
    },
    removeListener: function _removeListener(ev, handler) {
        if (!this._events[ev]) return;
        this._events[ev].splice(this._events[ev].indexOf(handler), 1);
    },
    removeAll: function _removeAll(ev) {
        delete this._events[ev];
    },
    emit: function _emit(ev, data) {
        if (!this._events[ev]) return;
        this._events[ev].forEach(invokeHandler);

        function invokeHandler(handler) {
            handler(data);
        }
    }
};

EventEmitter当我需要快速而肮脏的自定义事件时,我会使用一个小的。

我的和你的实现之间的唯一区别是我的允许每个事件有多个回调。

对于任何严重的事情,我都会使用EventEmitter2 之类的事件库

于 2011-12-13T21:02:44.767 回答
0

您正在寻找JavaScript的观察者模式。

SpineBackbone为观察者提供了一些不错的实现。

但是一个新的很好的模式是CommonJS中记录的 Promises 模式

jQuery 1.7已经实现并深入使用了 Promise 模式。

我最喜欢的 Promises 模式实现是来自@kriskowal的Q

我希望,这些资源可以帮助您完成任务。

于 2011-12-13T21:00:08.307 回答