2017-10-12 60 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

好的。我只添加了鏈接,因爲大部分時間導致這種錯誤的原因都是隱藏在代碼中的遞歸。對不起,如果它沒有幫助你找到解決方案。 –

相關問題