超出最大调用堆栈,不涉及递归

时间:2017-10-12 20:49:30

标签: javascript node.js server socket.io

我正在为一个小游戏编写服务器代码,经过多次测试后,我收到此错误Maximum call stack size exceeded

逻辑非常简单。每个游戏实例需要2名玩家。当玩家访问localhost服务器时,他会看到2个选项: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个实例,host和其中一个,join与另一个实例,一切都按预期工作,游戏就会被找到并显示为一个按钮。如果我打开3个实例,host包含两个实例,join包含最后一个实例,我会收到此错误。

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

0 个答案:

没有答案