我有以下代码:
function Socket(io, playGame, mapper) {
io.on('connection', function (socket) {
// message handler for the chat message
socket.on('sendChat', function (data) {
console.log(socket);
console.log(data);
console.log('recieved chat');
var connectedPlayer = playGame.findConnectedPlayer(socket);
if (!connectedPlayer)
return;
var connectedGame = playGame.findConnectedGame(socket, connectedPlayer.gameId);
if (!connectedGame)
return;
// send update game with players properly ordered
for (socketIndex in this.sockets) {
var socket = this.sockets[socketIndex];
// send the new data to each player
socket.socket.emit('chatUpdate', { chatText: data.chat });
}
});
// message handler for join game message
socket.on('joinGame', function (data) {
console.log('recieved join:', JSON.stringify(data));
if (!playGame.newConnectedPlayer(socket, data))
return;
...
在sendChat的方法中,socket是未定义的。在joinGame的方法中,定义了socket。我尝试了几个想法,但问题仍然存在。任何帮助将不胜感激。
答案 0 :(得分:0)
您必须重命名2 socket
个变量中的一个 - 'connection'
的参数或循环中的var
:
io.on('connection', function (socket) {
for (socketIndex in this.sockets) {
var socket = this.sockets[socketIndex];
var
是shadowing参数,导致参数无法访问。
这部分是因为var socket
不仅存在于for
循环内。 JavaScript var
是function
- 作用域,其声明hoisted位于function
的顶部,如:
socket.on('sendChat', function (data) {
var connectedPlayer, connectedGame, socket; // each initially `undefined`
console.log(socket);
// ...
for (socketIndex in this.sockets) {
socket = this.sockets[socketIndex];
// ...
});
并且,具有相同的确切名称,最多只能从特定function
中找到其中一个。
另请注意,for
循环和var socket
并非真正必要。
您可以使用Socket.IO Server
的{{3}}向所有客户发送消息。
io.emit('chatUpdate', { chatText: data.chat });