События сокета запускаются несколько раз при переключении состояний в приложении AngularJS

Я подключаю приложение Angular JS с несколькими состояниями (маршрутами) с сервером Node (Socket), работающим на бэкэнде. Когда я посещаю какое-то другое состояние и возвращаюсь в состояние, в котором написан код сокета, он снова регистрируется, и когда возникает событие, функция вызывается несколько раз, что влияет на производительность.

 var socket = io.connect('127.0.0.1:3000');

        socket.on("connect",function(){
          console.log("connected");
        });


          socket.on("test-channel:App\\Events\\NewMessage", function(message) {
              if (vm.questions.length < 3) {

                  console.log("question fetching started");
                  vm.fetch_q();

              }
          });

Я попытался также включить io.connect('localhost') в службу и поместить только событие в контроллер, но затем он также срабатывает несколько раз.


person Honey Thakuria    schedule 05.12.2017    source источник
comment
Какой у Вас вопрос? каждый раз, когда вы загружаете контроллер - код внутри выполняется, включая команду var socket = io.connect('127.0.0.1:3000');, поэтому он пытается снова подключиться к серверу. переместите код подключения в отдельную службу и используйте службу во всем приложении.   -  person Elad    schedule 06.12.2017
comment
Я попытался поставить var socket = io.connect('127.0.0.1:3000'); также в службу и поместите событие socket.on('event',function(){}) внутри контроллера, но затем оно также вызывается несколько раз. Проблема в том, что socket.on(connect,function(){ alert(connected); }); события запускаются каждый раз, когда я повторно посещаю страницу   -  person Honey Thakuria    schedule 06.12.2017


Ответы (1)


Проблема в том, что ваш контроллер устанавливает событие «вкл» каждый раз, когда вы обращаетесь к этому контроллеру, и не удаляет его только при обновлении.

Если вы используете AngularJS, вы можете просто объявить $rootScope.socket = io.connect('127.0.0.1:3000');, а затем использовать его в своих контроллерах, как этот $rootScope.socket.emit('event', {});, тот же метод, когда вы хотите прослушать событие, но использовать on вместо emit.

В любом случае, это метод, который повышает производительность и способ разработки программы, но проблема из вашего вопроса все еще существует, потому что не очень хорошо хранить ваши прослушиватели событий в ваших контроллерах - только если вы что-то испускаете.

Вы можете решить проблему, используя прослушиватели событий в службе запуска AngularJS.

app.run(function($rootScope){
  $rootScope.socket.on('event', function(){
    // Do something..
  });
}

И если у вас есть больше событий для прослушивания, вы можете объявить событие в модуле, а затем потребовать модуль в службе run. Надеюсь быть хорошим решением для вас.

person Stepan Rafael    schedule 13.01.2018