node.js EventEmitter导致范围问题

时间:2013-03-21 10:13:48

标签: node.js event-handling this

当使用nodejs事件系统时,我遇到了一个恼人的问题。如下面的代码所示,当侦听器捕获事件时,事件发射器对象在回调函数中拥有“this”而不是侦听器。

如果将回调放在监听器的构造函数中,这不是一个大问题,因为除了指针'this'之外,你仍然可以使用构造函数范围中定义的其他变量,比如'self'或'that'方式。

但是,如果将回调放在构造函数之外,就像原型方法一样,在我看来,没有办法让听众''这个'。

不确定是否有其他解决方案。而且,对于为什么nodejs事件发出使用发射器作为侦听器的调用者安装有点困惑?

util = require('util');
EventEmitter = require('events').EventEmitter;

var listener = function () {
    var pub = new publisher();
    var self = this;
    pub.on('ok', function () {
        console.log('by listener constructor this: ', this instanceof listener);
        // output: by listener constructor this:  false

        console.log('by listener constructor self: ', self instanceof listener);
        // output: by listener constructor this:  true
    })
    pub.on('ok', this.outside);
}

listener.prototype.outside = function () {
    console.log('by prototype listener this: ', this instanceof listener);
    // output: by prototype listener this:  false
    // how to access to listener's this here?
}

var publisher = function () {
    var self = this;

    process.nextTick(function () {
        self.emit('ok');
    })
}

util.inherits(publisher, EventEmitter);

var l = new listener();

1 个答案:

答案 0 :(得分:5)

尝试将侦听器显式绑定到回调:

pub.on('ok', this.outside.bind(this));