簡體   English   中英

socket.emit在setTimeout()nodejs中不起作用

[英]socket.emit doesn't work inside setTimeout() nodejs

第一個playerHandler.nextTurn()將返回具有相應套接字ID的玩家列表中的第一個玩家,但是調用currsocket.emit不會執行任何操作。 然后,我嘗試了io.emit發出給所有其他玩家。 由於我最多可容納2位玩家,因此該事件不會在第一個玩家客戶端套接字內觸發。 調用第二個玩家currsocket.emit可以正常工作。 似乎setTimeout()有問題,因為在我的其他代碼中,這沒有任何問題(沒有超時)。

 socket.on('add-player', (player) => {
//console.log('socket add player hits');
console.log("add user name :" + player.name);
//add the new player
var newPlayer = { 'id': socket.id.toString(), 'name': player.name };
//dont use this. for the var declared above
var canWeKeepHim = { value: false };
var package = playerHandler.methods.addNewPlayer(newPlayer, canWeKeepHim);

//on successful addition of new player add him to gameroom socket room
if (canWeKeepHim.value) {
  socket.join('gameroom');
  console.log(player.name + 'joined socket room');
}

socket.emit('add-player-message', { type: 'success-message', package: package });
io.emit('add-player-list', playerHandler.methods.getNewPlayer());


//is the async nature of socket events a problem , the start-game never seems to be true;

if (GameHandler.currentGameState == GameHandler.yetToStartGame && playerHandler.methods.doWeHaveMaxPlayers()) {
  GameHandler.changeCurrentGameState(GameHandler.gameHasStarted);
  var delay = 3000;
  io.to('gameroom').emit('start-game', { value: true, delay: delay });
  //if the game state is still gameHasStarted after delay then fire the gameplay events
  GameHandler.gameArenaRedirectTimer = setTimeout(() => {
    if (GameHandler.currentGameState == GameHandler.gameHasStarted) {
      console.log('hey this works after 10s');
      var currentPlayerTurn = playerHandler.methods.nextTurn();
      currentPlayerTurn = playerHandler.methods.nextTurn();;
      var currsocket = io.sockets.sockets[currentPlayerTurn.id];
      currsocket.emit('next-turn', { myturn: true });
      //console.log(io.sockets.so)
      // io.emit('next-turn', { myturn: false, playerName: currentPlayerTurn.name });
      //io.to('gameroom').emit('next-turn', { myturn: false, playerName: currentPlayerTurn.name });
    }

  }, delay);

}

});

嘗試將套接字傳遞給setTimout

  GameHandler.gameArenaRedirectTimer = setTimeout((socket) => {
        if (GameHandler.currentGameState == GameHandler.gameHasStarted) {
          console.log('hey this works after 10s');
          var currentPlayerTurn = playerHandler.methods.nextTurn();
          currentPlayerTurn = playerHandler.methods.nextTurn();;
          var currsocket = io.sockets.sockets[currentPlayerTurn.id];
          currsocket.emit('next-turn', { myturn: true });
          //console.log(io.sockets.so)
          // io.emit('next-turn', { myturn: false, playerName: currentPlayerTurn.name });
          //io.to('gameroom').emit('next-turn', { myturn: false, playerName: currentPlayerTurn.name });
        }

      }, delay,socket);

我發現將setTimeout移出socket.on事件偵聽器回調並移出io.on事件偵聽器可以解決此問題。

function startCountDownToStartGame(callback, delay, arg) {
if (GameHandler.currentGameState == GameHandler.gameHasStarted) {
GameHandler.gameArenaRedirectTimer = setTimeout(callback, delay, arg);
 }

};
io.on('connection', (socket) => {
 console.log('user connected :' + socket.id);

 socket.on('disconnect', function () {
 console.log('user disconnected');
//TODO : remove player from the player list once hes disconnected
});

socket.on('add-player', (player) => {
//console.log('socket add player hits');
console.log("add user name :" + player.name);
//add the new player
var newPlayer = { 'id': socket.id.toString(), 'name': player.name };
//dont use this. for the var declared above
var canWeKeepHim = { value: false };
var package = playerHandler.methods.addNewPlayer(newPlayer, canWeKeepHim);

//on successful addition of new player add him to gameroom socket room
if (canWeKeepHim.value) {
  socket.join('gameroom');
  console.log(player.name + 'joined socket room');
}

socket.emit('add-player-message', { type: 'success-message', package: package });
io.emit('add-player-list', playerHandler.methods.getNewPlayer());

if (GameHandler.currentGameState == GameHandler.yetToStartGame && playerHandler.methods.doWeHaveMaxPlayers()) {
  GameHandler.changeCurrentGameState(GameHandler.gameHasStarted);
  var delay = 3000;
  io.to('gameroom').emit('start-game', { value: true, delay: delay });
  delay += 1000;// this is a temp fix
  //it seems calling the settimeout within the socket.on will somehow affect the emit functions for all other socket
  //other than the current socket , by placing the settimeout outside , it fixed the problem .
  startCountDownToStartGame((socket) => {
    var currentPlayerTurn = playerHandler.methods.nextTurn();
    var currsocket = io.sockets.sockets[currentPlayerTurn.id];
    currsocket.emit('next-turn', { myturn: true });
    currsocket.broadcast.to('gameroom').emit('next-turn', { myturn: false, playerName: currentPlayerTurn.name });
  }, delay, socket);

}



});

 }

暫無
暫無

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

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