javascript - socket.io:如何确保设置了值

标签 javascript websocket socket.io

我的代码依赖于在继续之前设置的其他代码。如何限制 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 中,你不能“等待”或“ sleep ”直到有事情发生。事实并非如此。相反,您注册某种事件处理程序,当发生这种情况时,您会触发相关代码。对于您的情况,您可以这样做:

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

关于javascript - socket.io:如何确保设置了值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39672141/

相关文章:

javascript - 如何生成一个可以被另一个随机生成的数字整除的随机数

ruby-on-rails - 客户端服务架构 : keep client in sync with in-memory data sctructure

node.js - 长轮询的硬缺点?

node.js - 如何获取 socket.io 连接的引用者

javascript - 外部 Bootstrap 弹出窗口(https ://github. com/kartik-v/bootstrap-popover-x)方法和事件不起作用?

JavaScript 子字符串返回错误

PHP 游戏服务器,多个 TCP 客户端?

iphone - 3G 连接上的 WebSockets

node.js - 什么时候使用 socket.io ?什么时候使用简单的 Http 调用?

javascript - 正则表达式在匹配的单词周围放置标签