События сокетов запускаются несколько раз при переключении состояний в приложении 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') в службу также и поместить только событие в контроллер, но затем оно также запускается несколько раз.

1 ответ

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

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

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

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

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

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

Другие вопросы по тегам