如何替换Node JS事件接收器的`this`?

时间:2015-06-06 21:07:38

标签: node.js eventemitter

发送活动时是否可以替换this上下文?

var that = {}, obj = new myType();

// how to pass `that` as the calling context?
obj.emit('myEvent', data);

obj.on('myEvent', function () {
    // I need it to arrive with `this`=`that`
});

我正在使用标准EventEmitter继承方法:

在我的类型的开头:

events.EventEmitter.call(this);

遵循类型函数:

myType.prototype.__proto__ = events.EventEmitter.prototype;

但是这似乎覆盖了我在emit函数中指定的任何上下文的任何myType。当我需要一个不同的this上下文时,我无法弄清楚如何发送它。

1 个答案:

答案 0 :(得分:0)

如果要在每次发送事件时更改上下文,可以将包含上下文的另一个对象传递给emit函数。然后我们可以编写一个包装器函数,它自动将新上下文绑定到处理程序。

例如:

function withContext(fn) {
   return function(data, context) {
       return fn.call(that, data);
   }
}

// how to pass `that` as the calling context?
obj.emit('event_1', data, context_1);
obj.emit('event_2', data, context_2);


obj.on('event_1, withContext(handler_1));
obj.on('event_2', withContext(function(data) { 
  this === that // true;
});