簡體   English   中英

socket.io:如何確保設置值

[英]socket.io: how to ensure a value is set

我有代碼依賴於在程序之前設置的其他代碼。 如何限制dom等待直到從服務器發送內容才繼續? 我嘗試了一個while語句,最終得出“超出調用堆棧”的異常。 我也試過setTimeOut,而render()將起作用,我仍然會在render中得到一個異常,說明selfId還沒有定義。 我該如何解決這些問題?

示例:客戶:

<!DOCTYPE html>
<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
        <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
        <link href="client/main.css" rel="stylesheet"</link>
    </head>
    <body>
        <div id="game">
            <!--GAMEBOARD-->
            <canvas id="ctx"></canvas>
            <!--CHATUI-->
            <div id="chat" class="chat">
                <div id="messages" class="messages">
                    <div>Welcome to Simon's Game Server</div>
                </div>
                <input id="chatinput" class="chatinput"></input>
            </div>
            <div id="fps"></div>
            <!--ADDITIONALUI-->
        </div>
        <script>
            var socket = io();
            //game loop
            var lastTime;
            function gameLoop() {

            }

            //init
            var selfId = null;   //How do i set this variable when the first user connects?  This is my question
            socket.on('setSelf', function (data) { //this is my attempt, but it is not working for the first user.
                console.log('Setting selfId to: ' + data.id);
                selfId = data.id;
                gameLoop();
            });

        </script>
    </body>
</html>

服務器:

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

//routes
app.get('/', function (req, res) {
    res.sendFile(__dirname + '/client/index.html');
});
app.use('/client', express.static(__dirname + '/client'));

server.listen(port);


var UNIQUEID = 0;
io.sockets.on('connection', function (socket) {
    socket.myid = UNIQUEID;
    UNIQUEID++;
    socket.emit('setSelf', { id: socket.myid }); 
});

在Javascript中,在發生某些事情之前,您不能“等待”或“睡眠”。 它不起作用。 相反,您注冊了某種事件處理程序,當發生這種情況時,您會觸發相關代碼。 在你的情況下,你可以這樣做:

var selfId = null;
socket.on('setSelf', function (data) {
     selfId = data.id;
     // don't call gameLoop until you get here and selfId is set
     gameLoop();
});

function gameLoop() {
    render();
    //....
    playerState();
    //
    //etc ....
    //
}

另外,在服務器上,你不應該覆蓋socket.id因為socket.io會將自己的id硬幣化,並在自己的內務中使用它。 如果您想在socket對象上存儲某些屬性,我建議您創建自己唯一的,不沖突的屬性名稱,例如.myId

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM