【问题标题】:Nodejs EventEmitter - Define scope for listener functionNodejs EventEmitter - 定义侦听器函数的范围
【发布时间】:2011-12-21 18:39:39
【问题描述】:

我想要这样的作品:

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 有一些特殊的(或明显的;)方法来做到这一点......

感谢您的帮助!

【问题讨论】:

    标签: javascript node.js scope eventemitter


    【解决方案1】:

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

    但是你能做的就是这个

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

    您的事件处理程序没有被调用的原因是因为所有处理程序都存储在._events 中,所以如果您将._events 复制过来,它应该可以工作。

    【讨论】:

    • Doh,现在看起来很明显。谢谢你的光芒:)。
    • 由于在从 EventEmitter 扩展的对象上创建的 _events 属性不是其记录的公共接口的一部分,这是明智的建议吗?
    • @RobRaisch 不,但不太可能改变。
    • 截至今天,对于 Node 0.10.38、0.12.4 和 IO.JS 2.2.1,这种方法仍然可以正常工作。时间证明:) 很好的答案!谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • 这样简单!但是,不幸的是,如果发射不在您的控制之下,但框架无法解决问题。
    • 所有相反的证据。 4 年后,公认的答案在 Node JS 的每个版本中仍然有效:0.10.38、0.12.4、IO.JS 2.2.1。像魅力一样工作:)
    【解决方案3】:

    我在 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

    【讨论】:

    • 接受的答案完美无缺,不需要整个额外的库:)
    • 这叫代码复用。 “整个额外库”是一个 37 行的 Javascript 文件,但由于它是一个已发布的包,因此您可以在许多项目中使用它,而无需寻找您添加了已接受答案的那个项目。此外,发布时不存在已接受的答案。
    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2017-11-22
    • 2017-07-29
    相关资源
    最近更新 更多