Saturday 10 June 2017

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

The first playerHandler.nextTurn() will return the first player from the player list with his corresponding socket id .But calling currsocket.emit won't do anything. I then tried io.emit which emits to all other players . Since I have max of 2 players , the event doesn't trigger inside the first player client socket. Calling the second player currsocket.emit would work properly . It seems there is some issue with the setTimeout() , since in my other code , this works without any issues (without timeout).

 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);

}

});



via JimmyJ

No comments:

Post a Comment