на все приложение*?
В сокет ио есть концепция комнат, это базовый паттерн. Реализация - шлешь в коннекшн уточняющую информацию о том, что тебе (не) нужно отслеживать
Про сокет ИО - это как пример, или при чем здесь сокет ио?)
Я так понял, здесь подразумевается, что и бэк переделывать надо будет?)
У сокет ио есть клиент и сервер часть Если ее юзать будешь то скорее всего
Если у тебя бек написан, как по сокету на id - да, это мусор
У меня серверная часть в Django, и я коннекчусь непосредственно туда, бэк не мой
Да, так и написан)
Псевдокод на get/set. Делаешь какую-то абстракцию над сокетом. Делаешь абстракцию над событиями. Динамично подписываешься на конкретный тип событий с конкретным id. Я хз, как это понятно описать без нормального стм, но попробую const ws = createWs(new WebSocket('...')); // ... ws.on('kek:updated').watch(updates => { if (updates.uuid !== getSelectedKek()) return; updateSelectedKek(updates); }) function selectKek(uuid) { setSelectedKek(uuid); ws.send('kek:watch', { ids: [uuid] }); } function updateSelectedKek(updates) { const uuid = getSelectedKek(); setKekes(getKekes().map(kek => (kek.uuid === uuid ? { ...kek, ...updates } : kek))); }
Без эффектора*)))
- создаешь общий инстанс сокета - при изменении выбранного ID шлешь событие "отслеживать Kek только с этим ID" и сохраняешь ID в стор - подписываешься либо на событие "Kek с этим ID изменился", либо на событие "Kek изменился" и фильтруешь по ID - в обработчике события обновляешь Kek в списке по ID - при уходе со страницы шлешь событие "отписаться от Kek"
Недавно немного работал с вэб сокетами в целом работа сводилась к отправке сообщений серверу по сокету и ожиданию ответа. Вот я и подумал. А что если такие парные операции оборачивать в промис с таймаутом ожидания? или такое не очень хороший подход?
Что оборачивать? Там же просто вешаются слушатели на на соединение и срабатывают они только когда приходить что то с сервера
Оборачивать сразу две операции, запрос и ответ. КОгда запрос посылаем, то передаем ид по которому можем связать ответ с запросом резолвы промисов записываем куда нибудь типа promiseId: resolve когда ответ ответ приходит, то из карты по ид берем резолв и вызываем его передавая в него ответ а в коде это будет выглядеть потом типа const res = await "сделай запрос на сокет и верни результат".
Концепция комнат в том, что на бэке есть метод отписки от комнаты и подписки на комнату. На фронте можно не заморачиваться и просто получать ивенты (подконнектившись к совету один раз + юзать один ивент с фронта для смены прослушиваемой комнаты). Список коннектов к комнатам лучше в кэше на сервере. И все это для того, чтоб не хватать все ивенты на фронте подряд по одному каналу (и выбирать из них нужный). Для справки. Заморочиться с стм - это прям если охота конкретно пое*аться на фронте ))
Каво оборачивать?)
https://t.me/react_js/1947932
А, ну тебе уже всё ответили. await untilSubscribed можно await waitForEvent (читай - once) можно Для чего-то унарного можно, но сами сокеты - стрим, нет там промисов
Ага, спасибо, я уже примерно понял о чем суть.
Обсуждают сегодня