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

当谷歌在 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 回答