Самый эффективный способ написания пользовательских .on () /. Bind () JavaScript - PullRequest
3 голосов
/ 14 декабря 2011

Я пишу много маленьких библиотек и модулей, и обычно с этими библиотеками и модулями связаны некоторые события. До сих пор я писал такие (сильно сокращенные):

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

тогда пользователь будет делать что-то вроде:

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

Есть ли более эффективный способ сделать это или это стандартный способ реализации? Мне нужен простой API, который я могу добавить в любой проект JS для поддержки этого поведения.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011
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

0 голосов
/ 14 декабря 2011

Вы ищете Шаблон наблюдателя для JavaScript.

Spine и Backbone имеют несколько хороших реализаций для наблюдателей.

Но новый хороший шаблон - это шаблон Обещаний, который задокументирован в CommonJS

jQuery 1.7 реализован и использует шаблон обещаний.

Моя любимая реализация из шаблона Promises - Q от @ kriskowal

Я надеюсь, что эти источники помогут вам в ваших поисках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...