2013-04-13 94 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