2011-10-24 31 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