Nodejs EventEmitter - 定义侦听器函数的范围

时间:2011-11-04 06:20:31

标签: javascript node.js scope eventemitter

我希望有这样的工作:

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');

但是,不幸的是,听众甚至没有被召唤。有没有办法做这个W / EventEmitter?我可以Function.bind给听众,但是,我真的希望EventEmitter有一些特殊的(或明显的)方法来做到这一点......

感谢您的帮助!

3 个答案:

答案 0 :(得分:11)

不,因为侦听器中的this值是事件发射器对象。

但是你能做的就是这个

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

您的事件处理程序未被调用的原因是因为所有处理程序都存储在._events中,因此如果您将._events复制到它上面就应该有效。

答案 1 :(得分:2)

这不起作用,只有传递参数的方便方法,但是没有用于设置this的方法。看起来你必须自己做绑定的东西。但是,您可以将其作为参数传递:

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

答案 2 :(得分: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