Имам услуга 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 на гнездото на компонентите актуални със заменените?