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のObserver パターンを探しています。

SpineBackboneには、オブザーバー向けの優れた実装がいくつかあります。

しかし、新しいナイス パターンは、 CommonJSで文書化されている Promises パターンです。

jQuery 1.7は promise パターンを実装し、深く使用しています。

Promises パターンの私のお気に入りの実装は、@kriskowalのQです。

この情報源があなたの探求に役立つことを願っています.

于 2011-12-13T21:00:08.307 に答える