Как да се абонирам отново за събития на socket.io след повторно свързване в componentDidMount?

Имам услуга Socket, която реализира връзка към socket.io и има някои методи за абонамент, като включване и изключване.

Импортирам тази услуга към компоненти, за да могат да се абонират за събития на socket io. Това се прави в компонентаDidMount по следния начин:

import Socket from '/services/

class MyComponent extends React.Component {

  constructor() {
    super()
  }

  componentDidMount() {
    Socket.on("my-event", data => console.log(data))
  }

}

Всичко работи перфектно. Но проблемът възниква, докато се случат повторни връзки.

Понякога след успешно автоматично повторно свързване след прекъсване на връзката събитията няма да достигнат и няма да се случат. Искам да кажа, че сокетът затваря и излъчва събитие за прекъсване на връзката, автоматично след това се опитва да се свърже отново и го прави успешно. Но събитието my-event не се задейства.

Вярвам, че това се случва, защото слушателят на my-event слуша СТАРИ сокет, който сега е затворен и заменен от нов, така че вероятно слушателят на събития също трябва да бъде заменен и рестартиран.

Опитах се да изпращам ping до сървъра на всеки 15 секунди и оставях сървъра да ги изпраща обратно към клиента, за да поддържа сокета жив - това подобри връзката, но въпреки това понякога сокетът прекъсва и това е, потребителите няма да бъдат уведомени за моето събитие повече, освен ако не извършат пълно опресняване на цялото приложение.

Какво води до разбирането, че това не е проблем с интернет връзката, а нещо като грешни абонаменти.

Каква е най-добрата практика тук и как да поддържате събитията на io на гнездото на компонентите актуални със заменените?


person Raz    schedule 27.07.2020    source източник


Отговори (1)


Трябва да използвате socket.removeListener('my-event'), за да изтриете предишното събитие

person Matheus Correa    schedule 15.12.2020