Node.js将函数委托给导入的模块

时间:2013-04-13 12:10:16

标签: node.js events eventemitter

目前我有一个Node.js模块,其格式如下:

var events = require('events');
var emitter = new events.EventEmitter();

function emitSomething() {
    emitter.emit("event");
}
exports.emitSomething = emitSomething;
exports.on = emitter.on;

但是,当我致电on时,通过emitSomething注册的任何回调都不会被调用。

我可以通过将最后一行改为

来解决这个问题
exports.on = function(event, callback) { emitter.on(event, callback); };

有没有理由我不能将on函数委托给另一个模块中定义的函数?

1 个答案:

答案 0 :(得分:3)

这是一个常见的JS错误。请注意,on方法取决于this(在您的示例中为emitter)。但是,您导出的只是函数本身,所以当您稍后调用它时,它的上下文(emitter)会丢失。

以下是此问题的一个小示例:

var someObj = { 
    doSth: function() { console.log(this) } 
};
someObj.doSth(); // "Object { ..."

var doSth = someObj.doSth;
doSth(); // "Window { ..."

当我将doSth称为someObj的方法时,this按预期引用someObj。将函数复制到doSth后,this引用它的新上下文,在浏览器中引用全局上下文Window。这就是你的情况。

正如您已经提到的,您必须将emitter上下文绑定到该函数。这也可以这样做:

exports.on = emitter.on.bind(emitter);