超过最大调用堆栈,不涉及递归
我正在编写一个小游戏的服务器代码,经过多次测试后,我得到这个错误Maximum call stack size exceeded
。超过最大调用堆栈,不涉及递归
逻辑非常简单。每场比赛需要2名球员。当玩家访问localhost
服务器时,他会看到两个选择:host
和join
。在服务器端代码中有一个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个同时运行的游戏实例。有什么我可以做的吗?我看着这个错误的方式吗?
你可以检查这个答案,它可能会帮助你调试问题。
该程序中没有任何递归。一些相互呼叫的功能,但肯定不会导致这样的问题:/ – VlassisFo
好的。我只添加了链接,因为大部分时间导致这种错误的原因都是隐藏在代码中的递归。对不起,如果它没有帮助你找到解决方案。 –
你在哪里得到这个错误,服务器,第一客户端或者第二客户端? – Bergi
你是否得到了'RangeError:超出最大调用堆栈大小' – kemotoe
@kemotoe是的正好 – VlassisFo