2013-04-13 93 views
0

目前,我有一个Node.js的模块具有以下形式: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); }; 

是否有一个原因,我无法委派的功能到另一个模块中定义的函数?

+0

你怎么“注册”你的回调与“开”? – robkuz

+0

@robkuz同样的方式,我将注册与任何EventEmitter的回调,所以如果我的模块被称为“myModule”,我会注册myModule.on(“事件”,功能(){console.log(“调用”);} ); – ahjmorton

回答

3

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

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

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

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

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

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

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

Ahhh我没有意识到使用导出绑定到“this”参数的导出。那是我陷入困境的地方。标记为已回答。 – ahjmorton