169 похожих чатов

Подскажите, почему у меня useEffect срабатывает в компоненте, который должен

был размонтироваться по логике..? у меня там зарегистрированы обработчики сокета, типа socket.on('connect', () => {...
они все равно сработают?...

17 ответов

7 просмотров

покажи как разрываешь коннект на размонтирование компонента

Ivan-Minin Автор вопроса
Dmitriy Shuleshov
покажи как разрываешь коннект на размонтирование к...

в том и дело, что мне не нужно разрывать коннект. у меня разрывается только соединение с комнатой (socket.leave(room), т.к. я присоединяю пользователя к сокету при успешной авторизации, а на определенных маршрутах я просто загоняю в комнату его или выгоняю. из-за этого я не могу никак победить ситуацию, в которой я пытаюсь обрабатывать разрыв соединения с сокетом на определенной странице (той самой комнаты) и все это срабатывает на любом маршруте, что мне не нужно... это можно решить, если я буду соединять и разъединять сокет только в этих самих комнатах, но я бы хотел взаимодействовать с пользователем на любом маршруте, но никак не могу решить эти проблемы и найти такие ситуации нигде не могу

Ivan-Minin Автор вопроса

вот я в головном компоненте регистрирую сокет: useEffect(() => { if (isAuth) { dispatch( SocketActionCreators.setSocket( io(API_URL, { transports: ['websocket'], path: '/server', }) ) ); } else if (socket && !isAuth) { socket.disconnect(); } }, [isAuth]); вот компонент комнаты: useEffect(() => { if (socket) { socket.on('connect', () => { ...все что тут - сработает на любой странице. ну это понятно, почему. но как можно сделать, чтобы только на этой }); socket.on('disconnect', () => { ...все что тут - сработает на любой странице. ну это понятно, почему. но как можно сделать, чтобы только на этой }); socket.emit('user:join-webinar', { user, webinarId }); ...другие обработчики... return () => { socket.emit('user:left-webinar', { user, webinarId }); }; } }, [webinarId, socket]);

Ivan Minin
вот я в головном компоненте регистрирую сокет: us...

return () => { socket.emit('user:left-webinar', { user, webinarId }); socket.removeAllListeners(["connect", "disconnect"]); };

Ivan-Minin Автор вопроса

да, спасибо, я тоже находил это, но почему-то срабатывает только если удалять вообще все.. а если указать конкретные, все также остается socket.removeAllListeners()

Ivan Minin
да, спасибо, я тоже находил это, но почему-то сраб...

почему не срабатывает? Те как вы это поняли?

Ivan-Minin Автор вопроса

потому что при дисконнекте я вывожу сообщение вот так socket.on('disconnect', () => { message.error({ content: 'Потеря соединения', key: 'updatable', duration: 2, }).then(() => message.loading({ content: 'Пытаемся восстановить подключение...', key: 'updatable', duration: 0, }) ); }); и если я указываю конкретные слушатели, то при разрыве соединения на другой странице, после размонтирования компонента комнаты, все равно появляется это сообщение. а вот если я укажу удалить все, тогда уже не появляется. но так будет неправильно, ведь я удалю вообще все, и толку от этого сокета не будет

Ivan-Minin Автор вопроса

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

Ivan Minin
потому что при дисконнекте я вывожу сообщение вот ...

ну по виду должен рваться коннект. Что в девтулзах при размонтировании? Воспроизведите флоу просто по кликам допустим

Ivan Minin
короче вся проблема в том, что я не могу обработат...

что такое комнаты? Как подключится в вашем апи к конкретной комнате?

Ivan-Minin Автор вопроса
Dmitriy Shuleshov
что такое комнаты? Как подключится в вашем апи к к...

сейчас так сделал: если перейти на любой роут авторизованным, создают сокет на клиенте. если перейти по маршруту /webinar/:webinarId - я отправляю эммит на сервер socket.emit('user:join-webinar', { user, webinarId }); и на сервере его обрабатываю socket.on('user:join-webinar', joinWebinar); ... const joinWebinar = async ({ user, webinarId }) => { socket.join(webinarId); await addUser({ user, webinarId }); }; и для выхода из комнаты аналогично, только эмичу событие при размонтировании компонента

Это на какой мой вопрос был ответ?

Ivan-Minin Автор вопроса
Dmitriy Shuleshov
Это на какой мой вопрос был ответ?

ну вы спросили, как у меня "ак подключится в вашем апи к конкретной комнате?" :)

Ivan Minin
ну вы спросили, как у меня "ак подключится в вашем...

а что за ивенты тогда конект и дисконект?

Ivan-Minin Автор вопроса
Dmitriy Shuleshov
а что за ивенты тогда конект и дисконект?

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

Ivan Minin
это общие для сокета, они к конкретной комнате не ...

Так если это общие то зачем их разрывать?

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
96
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Вопрос вроде правильно, но что надо сделать, чтоб текст был виден нормально ? ghci> TE.decodeUtf8 $ TE.encodeUtf8 "test - проба" "test - \1087\1088\1086\1073\1072"
Fedor
7
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Кто может подсказать? Я преобрпзовал изображение в бинарное(у меня установлен трекбар который при установленном значении меняет пиксели на белый если меньше и чёрный если боль...
Константин VS
5
Карта сайта