2015-12-05 3 views
1

Я только начал собирать socket.io. Я пытаюсь использовать его в angular.js, и все работает нормально. Тем не менее, он продолжает возвращаться несколько разПочему socket.io возвращает несколько раз для события

в моем controller.js

socketio.emit('GameOver',$scope.currentPlayer.Name); 
     socketio.on('GameOverEmit',function(data){ 
     if(data === $rootScope.user.user_name){ 
      var result = { 
      opponent : rdyplayers.user_name, 
      result : "won" 
      }; 
      // keep getting multiple result 
      console.log(result); 
     }else{ 
      var result = { 
      opponent : rdyplayers.user_name, 
      result : "lose" 
      }; 
      // keep getting multiple result 
      console.log(result); 
     } 
     }); 

В моем server.js

io.sockets.on('connection', function (client) { 
​ 
      client.user_name = user.user_name; 
​ 
      //Useful to know when someone connects 
      console.log('\t socket.io:: player ' + client.user_name + ' connected'); 
      // playerturn 
      client.on('PlayerTurn',function(data){ 
       io.emit('PlayerTurnEmit',data); 
​ 
      }); 
      // game over 
      client.on('GameOver',function(data){ 
       io.emit('GameOverEmit',data); 
​ 
      }); 
      // button disabled 
      client.on('PlayerButtonDisabled',function(data){ 
       io.emit('PlayerButtonDisabledEmit',data); 
      }); 
       //When this client disconnects 
      client.on('disconnect', function() { 
        //Useful to know when someone disconnects 
       console.log('\t socket.io:: client disconnected ' + client.user_name); 
       io.emit("disconnected",client.user_name); 
      }); //client.on disconnect 
​ 
     }); //io.sockets.on connection 

Могу ли я с помощью Socket.io в правильном пути? Чтобы транслировать данные всем, я просто передаю данные в emit и передаю данные, переданные с помощью on, например, передают данные на сервер и передают их обратно в интерфейс.

ответ

2

это вызвано контроллером .js, всякий раз, когда я пересматриваю страницу, он установит новый сокет, чтобы я сделал это, когда пользователь покидает или закрывает на вкладке он удаляет все слушатель. я в конечном итоге решить ее путем добавления getsocket в моем service.js

ttt.factory('socketio', ['$rootScope', function ($rootScope) { 
    'use strict'; 

    var socket = io.connect(); 
    return { 
     on: function (eventName, callback) { 
      socket.on(eventName, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        callback.apply(socket, args); 
       }); 
      }); 
     }, 
     emit: function (eventName, data, callback) { 
      socket.emit(eventName, data, function() { 
       var args = arguments; 
       $rootScope.$apply(function() { 
        if (callback) { 
         callback.apply(socket, args); 
        } 
       }); 
      }); 
     }, 
     getSocket: function() { 
     return socket; 
     } 

    }; 
}]); 

и в моем controller.js я действительно

$scope.$on('$destroy', function (event) { 
    socketio.getSocket().removeAllListeners(); 
}); 
+1

Спасибо, что это решило мою проблему. –

+0

@ Love-Kesh рад, что это помогает! rmb, чтобы ответить на вопрос или ответ! –

+1

@JohnLim Ты потрясающий человек !! работая над этим вопросом за последние два дня. много пробовал. Наконец, это работает. – srbhbarot

3

Для использования широковещательного socket.broadcast.emit()

Я не нахожу сокет разъединение слушать код события в вашей стороне клиента код .. попробуйте добавить socketio.disconnect для отключения на стороне клиента

А также добавить слушателя к гнезду отключить событие от сервера к клиенту .. на стороне клиента, добавив socketio.on('disconnect', function(){do something})

+0

Привет Али, я не вижу, добавляя разъединение к стороне клиента поможет мне решить проблему, но я ценю, что вы это указали. –

+0

Эй, @JohnLim, не могли бы вы рассказать о своей проблеме ... что происходит, возвращаясь несколько раз? – Ali

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