2011-10-24 35 views
-1

我正在寫一個簡單的WebSocket應用程序與socketio。有2個插座事件可以在連接和消息上實現。第一個接收套接字作爲參數(客戶端),第二個接收客戶端發送的數據。所以,我可以把它寫這種方式使用插座變量上的消息事件:如何從更廣泛的範圍使用Javascript變量

WebSocketNoaListener.onClientConnect = function(socket){ 
var soc = socket; 
socket.on("message", function(msg){ 
     console.log("i can use message: "+msg); 
     console.log("and the socket: "+soc.id); 
    }); 
socket.on("disconnect", WebSocketNoaListener.onClientDisconnect); 
} 

但我要分開我的功能更好的可讀性:

WebSocketNoaListener.onClientConnect = function(socket){ 
var soc = socket; 
socket.on("message", WebSocketNoaListener.onClientMessage); 
socket.on("disconnect", WebSocketNoaListener.onClientDisconnect); 
} 


WebSocketNoaListener.onClientMessage = function(){... 

我會需要使用soc變量在收到socket的函數之外的範圍內。那可能嗎?

+0

你是什麼意思的「outerscope」在這裏? – JaredPar

+0

@JaredPar我冒昧地重新編寫了「outerscope」 – dlamblin

回答

1

你應該真的這樣做,而不是污染全局空間(此外,另外兩個答案中給出的解決方案不能處理兩個同時連接,因爲每個連接都會覆蓋soc)。

WebSocketNoaListener.onClientMessage = function(soc, msg){ 
    console.log("i can use message: " + msg); 
    console.log("and the socket: " + soc.id); 
}; 
WebSocketNoaListener.onClientDisconnect = function(soc, event){ 
    console.log("not implemented in question"); 
}; 
WebSocketNoaListener.onClientConnect = function(socket){ 
    socket.on("message", WebSocketNoaListener.onClientMessage.bind(this, socket)); 
    socket.on("disconnect", WebSocketNoaListener.onClientDisconnect.bind(this, socket)); 
} 
+0

好吧,您在上述情況下是正確的,全局套接字變量不會指向屬於​​該事件的正確套接字實例。上述案例回答了我的問題,但沒有解決我的問題。 「這個」範圍確實指出了套接字本身,所以你的答案是正確的解決方案。 – eyurdakul

1

初始化您的onClientConnection函數之外的soc

var soc; 

WebSocketNoaListener.onClientConnect = function(socket){ 
    soc = socket; 
    socket.on("message", WebSocketNoaListener.onClientMessage); 
    socket.on("disconnect", WebSocketNoaListener.onClientDisconnect); 
} 

soc現在可以在onClientConnect之外訪問。

-2

確定這裏是websocket特定的最終答案;

WebSocketNoaListener.onClientConnect = function(socket){ 
    var soc = socket; 
    socket.on("message", WebSocketNoaListener.onClientMessage); 
    socket.on("disconnect", WebSocketNoaListener.onClientDisconnect); 
} 

WebSocketNoaListener.onClientMessage = function(msg){ 
    console.log("this is the message "+msg); 
    console.log("and this is the id of the socket "+this.id); 
    //'this' points here the socket itself 
} 
+0

沒有反思爲什麼,什麼是錯的首先。 – dlamblin

+0

如果我的答案完全錯過了你的問題的重點,我很抱歉。我刪除了它。 http://stackoverflow.com/posts/7878346/revisions – dlamblin