2016-09-24 9 views
1

私は、実行する前に設定する他のコードに依存しているコードを持っています。続行する前に、サーバーからアイテムが送信されるまでDOMを待つように制限するにはどうすればよいですか?私はwhile文を試しましたが、 "call stack exceeded"例外が発生します。私も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> 

サーバー:何かが起こるまで、JavaScriptで

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

'setSelf'の内部で' gameLoop(); 'をなぜ呼び出さないのですか? – monkeyinsight

+0

私はこれを試しましたが、まだプロジェクトをビルドし、最初にサーバーにヒットし、コンソールでselfIdをエコーすると、定義されていません。 なぜですか? – simon

答えて

0

、あなたが "待機" することはできませんか、 "スリープ"。そのようには機能しません。代わりに、何らかのイベントハンドラを登録し、そのときに問題のコードをトリガします。

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.ioコインとして独自のIDをsocket.idを上書きすべきではないと、独自のハウスキーピングでいることを使用しています:あなたのケースでは、次のようなことを行うことができます。 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

関連する問題