8

この作品のようなものが欲しいです:

var Events=require('events'),
    test=new Events.EventEmitter,
    scope={
        prop:true
    };

test.on('event',function() {
   console.log(this.prop===true);//would log true
});
test.emit.call(scope,'event');

しかし残念ながら、リスナーは呼び出されません。EventEmitter でこれを行う方法はありますか? リスナーにはできますが、これを行うための特別な(または明白な)方法があるFunction.bindことを本当に望んでいます...EventEmitter

助けてくれてありがとう!

4

3 に答える 3

11

いいえ、thisリスナーの値はイベント エミッター オブジェクトであるためです。

しかし、あなたができることはこれです

var scope = {
  ...
};
scope._events = test._events;
test.emit.call(scope, ...);

イベントハンドラーが呼び出されなかった理由は、すべてのハンドラーが保存されて._eventsいるため、コピー._eventsすると機能するはずです。

于 2011-11-04T22:35:23.733 に答える
2

それは機能せず、emit にはパラメーターを渡す便利な方法しかありませんが、設定する方法はありませんthis。結び方は自分でやらなければならないようです。ただし、パラメーターとして渡すこともできます。

test.on('event',function(self) {
   console.log(self.prop===true);//would log true
});
test.emit('event', scope);
于 2011-11-04T22:25:28.967 に答える
0

Google がこれを処理する NPM でパッケージを検索しているときに、この投稿に出くわしました。

var ScopedEventEmitter = require("scoped-event-emitter"),
    myScope = {},
    emitter = new ScopedEventEmitter(myScope);

emitter.on("foo", function() {
    assert(this === myScope);
});

emitter.emit("foo");

完全な開示、これは私が書いたパッケージです。含まれているオブジェクトに対して発行する EventEmitter プロパティを持つオブジェクトを作成できるようにするために必要でした。NPM パッケージ ページ: https://www.npmjs.org/package/scoped-event-emitter

于 2014-10-02T00:28:11.290 に答える