2017-10-12 61 views
0

我正在编写一个小游戏的服务器代码,经过多次测试后,我得到这个错误Maximum call stack size exceeded超过最大调用堆栈,不涉及递归

逻辑非常简单。每场比赛需要2名球员。当玩家访问localhost服务器时,他会看到两个选择:hostjoin。在服务器端代码中有一个javascript对象,用于跟踪可用的游戏。当用户选择加入时,服务器发出对象内的数据,并且每个可用的游戏以按钮的形式呈现给用户。

对象的结构是下面的(2个游戏运行):

var games = { 
    game_IDs : [], 
    socketIDOfHost1: { 
     "player1": socketOfPlayer1, 
     "player2": socketOfPlayer2 
    }, 
    socketIDOfHost2: { 
     "player1": socketOfPlayer1, 
     "player2": socketOfPlayer2 
    } 
} 

的代码是这样的:

服务器:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
}); 

var games = { 
    game_IDs: [] 
}; 

io.on('connection', function (socket) { 

    socket.on('join', function (data) { 
     socket.emit('join-data', games); 
    }); 

    socket.on('host', function() { 
     games.game_IDs.push(socket.id); 
     games[socket.id] = {}; 
     games[socket.id]["player1"] = socket.id; 
     socket.emit('host-data', socket.id); 
    }); 

    socket.on('game-select', function (data) { 
     games[data]["player2"] = socket; 
     games[socket.id] = games[data]; 
    }); 

}); 

http.listen(4000, function() { 
}); 

客户:

var socket = io(); 
    function host() { 
     document.getElementById("container").style.visibility = "visible"; 
     socket.emit('host', socket.id); 
    } 

    function join(){ 
     document.getElementById("container").style.visibility = "visible"; 
     socket.emit('join', "kappapride"); 
    } 

    function selectGame(id) { 
     socket.emit('game-select', id); 
    } 

    socket.on('host-data', function (data) { 
     let e = document.getElementById("container"); 
     let p1 = document.createElement("div"); 
     p1.innerHTML = "<h1>Player1: " + data + "</h1>"; 
     p1.style.width = "100%"; 
     e.appendChild(p1); 
    }); 

    socket.on('join-data', function (data) { 
     let e = document.getElementById("container"); 
     for(let i=0; i<data.game_IDs.length; i++){ 
      let game = document.createElement("button"); 
      game.innerHTML = data.game_IDs[i]; 
      game.addEventListener("click", function() { 
       selectGame(this.innerHTML); 
      }); 
      game.style.position = "absolute"; 
      game.style.width = "100%"; 
      game.style.height = "50px"; 
      game.style.backgroundColor = i%2==0? "aqua": "aliceblue"; 
      e.appendChild(game); 
     } 
    }); 

如果我打开2个ins浏览器,host与其中一个,和join与其他,一切都按预期工作,游戏被发现并显示为一个按钮。如果我打开3个实例,其中两个是host,而最后一个是join,我得到这个错误。

这显然是一个内存问题,但计划是让它工作,可能有超过2个同时运行的游戏实例。有什么我可以做的吗?我看着这个错误的方式吗?

+0

你在哪里得到这个错误,服务器,第一客户端或者第二客户端? – Bergi

+0

你是否得到了'RangeError:超出最大调用堆栈大小' – kemotoe

+0

@kemotoe是的正好 – VlassisFo

回答

-1

你可以检查这个答案,它可能会帮助你调试问题。

Maximum call stack size exceeded error

+0

该程序中没有任何递归。一些相互呼叫的功能,但肯定不会导致这样的问题:/ – VlassisFo

+0

好的。我只添加了链接,因为大部分时间导致这种错误的原因都是隐藏在代码中的递归。对不起,如果它没有帮助你找到解决方案。 –

相关问题