2017-10-12 1 views
0

J'écris le code du serveur pour un petit jeu, et après plusieurs tests, j'obtiens cette erreur Maximum call stack size exceeded.La pile d'appels maximale a été dépassée, sans aucune récursion.

La logique est vraiment simple. Chaque instance du jeu nécessite 2 joueurs. Lorsqu'un joueur visite le serveur localhost, il est présenté avec 2 choix: host et join. Dans le code côté serveur, il y a un objet javascript qui garde une trace des jeux disponibles. Lorsqu'un utilisateur sélectionne jointure, le serveur émet les données à l'intérieur de l'objet et chaque jeu disponible est présenté à l'utilisateur sous la forme d'un bouton.

La structure de l'objet est le suivant (pour 2 jeux en cours d'exécution):

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

Le code est le suivant:

Serveur:

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() { 
}); 

Client:

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); 
     } 
    }); 

Si j'ouvre 2 ins tances du navigateur, host avec l'un d'eux, et join avec l'autre, tout fonctionne comme prévu, le jeu est trouvé et affiché comme un bouton. Si j'ouvre 3 instances, host avec deux d'entre eux, et join avec le dernier, j'obtiens cette erreur. C'est clairement un problème de mémoire, mais le plan est de le faire fonctionner, avec éventuellement plus de 2 instances du jeu fonctionnant simoultanément. Y a-t-il quelque chose que je puisse faire? Est-ce que je regarde cela de la mauvaise façon?

+0

Où obtenez-vous cette erreur, sur le serveur, le premier client ou le second client? – Bergi

+0

Obtenez-vous le 'RangeError: la taille maximale de la pile d'appels a été dépassée? – kemotoe

+0

@kemotoe Oui exactement – VlassisFo

Répondre

-1

Vous pouvez vérifier cette réponse, cela pourrait vous aider à déboguer le problème.

Maximum call stack size exceeded error

+0

Il n'y a aucune récursion dans ce programme. Une poignée de fonctions qui s'appellent l'une l'autre, mais certainement pas une quantité qui pourrait causer un tel problème:/ – VlassisFo

+0

D'accord. J'ai seulement ajouté le lien parce que la plupart du temps ce qui cause ce genre d'erreur est la récursion cachée quelque part dans le code. Désolé si cela ne vous a pas aidé à trouver une solution. –