2013-04-17 16 views
1

我在具有導出的類函數構造函數的Node.js中創建一個模塊。我爲這個類添加了2個原型函數,但我也有一些獨立函數。運行函數時Node.js設置'this'

我用作事件和回調內部類的處理程序的普通函數。我不想將這些函數作爲類原型的一部分公開。

在自由站立功能的鏈接中,我想引用模塊構建的主類,以便可以發出事件(我使用util.inherits(myclassconsructor, EventEmitter))。但在我的內心功能this是不正確的。我嘗試了一個名爲self的模塊的全局變量,並且作爲構造函數的第一行做了self = this

然後我檢查,如果我做了self.on("message name", function() {console.log("worked")});它確實工作。

然後,我去了我的主要模塊,它構造有問題的模塊,並創建上述模塊並綁定到相同的事件。我沒有收到該事件的模塊外...

模塊A

var self; 
function A() { 
    self = this; 
    self.on('message name', function() { console.log('test') }); // Firing 
    doStuff(); 
} 
function doStuff() { 
    api.callApi(callback); 
} 
function callback() { 
    self.emit('message name'); 
} 

模塊B

var a = new A(); 
a.on('message name', domystuff); // Not firing 
function domystuff() { 
    console.log('my stuff'); 
} 

發現這個線程這似乎是我遇到的問題,但我無法重現結果。 node.js eventEmitter + http.request

回答

2

如果我理解正確,您要使用:

doStuff.call(this); 

代替。 call函數將調用它所調用的函數,並將this設置爲第一個參數。

參見文檔在Mozilla MDN

至於回調的問題,我可能會嘗試重組你的代碼是這樣的...

var inst = this; 
api.callApi(function(p1,p2,p3) { inst.emit('message name',p1,p2,p3); }); 

但也有稍微更優雅的方法。

+0

我想知道該怎麼做!儘管如此,我仍然遇到問題,因爲我的回調具有結果的上下文。例如,我的''api.callApi(回調);''是'mysqlConnection.query(「select * from tablex」,callback);'我給你一個+1但我要新... –

+0

對不起不完整的例子我的代碼需要大量共享,如果沒有我的外部服務器,需要花費大量精力來模擬我正在使用的連接。任何建議如何分享很多代碼? –

+1

JSFiddle非常適合共享代碼。投票我的答案將是偉大的,但直到你獲得聲望,你不能。你仍然可以接受這個答案! :-) – Forbesmyester