2016-09-24 3 views
1

У меня есть код, который опирается на другой код, который должен быть установлен перед процедурой. Как я могу ограничить дом до тех пор, пока материал не будет отправлен с сервера, прежде чем продолжить? Я попробовал заявление while, и я закончил исключение «стека вызовов». Я также попробовал setTimeOut, и пока функция render() будет работать, я все равно получаю исключение в рендере, заявляя, что selfId еще не определен. Как я могу обойти этот материал?socket.io: как установить значение

Пример: Клиент:

<!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 }); 
}); 
+1

Почему вы не называете 'gameLoop();' inside' setSelf'? – monkeyinsight

+0

Я пробовал это, и все же, когда я создаю проект и сначала попадаю на сервер, и пытаюсь эхо selfId на консоли, он появляется как неопределенный. Почему ??? – simon

ответ

0

В 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 монет своего собственного идентификатора и используете в своем домашнем хозяйстве. Если вы хотите сохранить что-то как свойство на объекте socket, я бы предложил вам создать собственное уникальное, не конфликтующее имя свойства, например .myId.

+0

Объясните мне, почему, если я ставлю console.log (selfId) сразу после selfId = data.id, консоль на клиенте покажет 0. Но пока я нахожусь на клиенте, если я набираю консоль selfId, я получаю Uncaught ReferenceError: selfId не определен (...) ??? – simon

+0

Я пробовал этот код и все еще на консоли, если я пытаюсь эхо selfId, я получаю эту ошибку ссылки. – simon

+0

@simon - Вам нужно будет показать мне точный код, который вызывает эту ошибку, потому что код, который у меня есть в моем ответе, не вызовет этого. Я предполагаю, что вы сделали что-то другое, чем то, что я здесь показываю. Кроме того, я замечаю, что вы перезаписываете 'socket.id' на сервере. Это очень плохая идея. socket.io использует 'socket.id' для собственного использования. Если вы хотите сохранить свойство на объекте сокета на стороне сервера, создайте другое имя свойства, например 'socket.myId', которое не конфликтует. – jfriend00

Смежные вопросы