Size: a a a

JavaScript — русскоговорящее сообщество

2020 November 15

ᴀᴋ

ᴀʟᴇxᴀɴᴅʀ ᴋᴜᴢɴᴇᴛsᴏᴠ... in JavaScript — русскоговорящее сообщество
Всем привет! Нужна помощь по socket.io + React js
Вот код: https://codeshare.io/5vkjzD

Принимаю с бэка через сокеты новые сообщения для чата и добавляю их в массив.  
В первый раз console.log срабатывает 2 раза подряд, затем 4, потом 8, 16 и тд. Соответственно сообщения приходят с одинаковой скоростью, но каждый раз в массив они добавляются все дольше и дольше, что для чата явно недопустимо. При переподключении сокетов (например при пепрезагрузке страницы) ситуация начинается заново.

Подскажите пожалуйста, как можно решить данную проблему. Заранее спасибо 🙂
источник

D

Danila in JavaScript — русскоговорящее сообщество
ᴀʟᴇxᴀɴᴅʀ ᴋᴜᴢɴᴇᴛsᴏᴠ
Всем привет! Нужна помощь по socket.io + React js
Вот код: https://codeshare.io/5vkjzD

Принимаю с бэка через сокеты новые сообщения для чата и добавляю их в массив.  
В первый раз console.log срабатывает 2 раза подряд, затем 4, потом 8, 16 и тд. Соответственно сообщения приходят с одинаковой скоростью, но каждый раз в массив они добавляются все дольше и дольше, что для чата явно недопустимо. При переподключении сокетов (например при пепрезагрузке страницы) ситуация начинается заново.

Подскажите пожалуйста, как можно решить данную проблему. Заранее спасибо 🙂
Обрати внимание на свой эффект
источник

D

Danila in JavaScript — русскоговорящее сообщество
Представь, когда и сколько раз он у тебя запускается
источник

D

Danila in JavaScript — русскоговорящее сообщество
А ведь каждый запус вешает новый обработчик на сокет
источник

D

Danila in JavaScript — русскоговорящее сообщество
Спойлер - он запускается чаще, чем нужно
источник

D

Danila in JavaScript — русскоговорящее сообщество
Ну и +, async писать нет смысла, если ты не await что-то внутри функции
источник

ᴀᴋ

ᴀʟᴇxᴀɴᴅʀ ᴋᴜᴢɴᴇᴛsᴏᴠ... in JavaScript — русскоговорящее сообщество
Danila
Ну и +, async писать нет смысла, если ты не await что-то внутри функции
Там идет сохранение в бд, я его просто убрал для песочницы
источник

D

Danila in JavaScript — русскоговорящее сообщество
ᴀʟᴇxᴀɴᴅʀ ᴋᴜᴢɴᴇᴛsᴏᴠ
Там идет сохранение в бд, я его просто убрал для песочницы
Энивей, проблема в эффекте. Он запускается каждый раз при изменении messages и вешает новый socket.on
источник

D

Danila in JavaScript — русскоговорящее сообщество
Твоя задача - чтобы socket.on выполнился только один раз
источник

D

Danila in JavaScript — русскоговорящее сообщество
ИЛИ хотя бы чтобы обработчик снимался при перезапуске эффкта сперва - для этого из эффекта нужно вернуть функцию clean-up, которая отменит подписку
источник

ᴀᴋ

ᴀʟᴇxᴀɴᴅʀ ᴋᴜᴢɴᴇᴛsᴏᴠ... in JavaScript — русскоговорящее сообщество
Danila
Энивей, проблема в эффекте. Он запускается каждый раз при изменении messages и вешает новый socket.on
А можешь подсказать, каким тогда образом это реализовать? Ибо это пока самый рабочий вариант. Без useeffect вообще дичь просходит, а с useeffect только в таком конфиге получилось заставить работать. Уже не первый день с этой проблемой бьюсь
источник

D

Danila in JavaScript — русскоговорящее сообщество
Верни из эффекта функцию ()=>socket.off(name, handler)
источник

D

Danila in JavaScript — русскоговорящее сообщество
ᴀʟᴇxᴀɴᴅʀ ᴋᴜᴢɴᴇᴛsᴏᴠ
А можешь подсказать, каким тогда образом это реализовать? Ибо это пока самый рабочий вариант. Без useeffect вообще дичь просходит, а с useeffect только в таком конфиге получилось заставить работать. Уже не первый день с этой проблемой бьюсь
useEffect(() => {
   const handler = (newMessage) => setMessages([...messages, newMessage])
   socket.on('NEW_MESSAGE_FROM_SERVER', handler);
   return () => socket.off('NEW_MESSAGE_FROM_SERVER', handler)
}, [messages]);
источник

D

Danila in JavaScript — русскоговорящее сообщество
ᴀʟᴇxᴀɴᴅʀ ᴋᴜᴢɴᴇᴛsᴏᴠ
А можешь подсказать, каким тогда образом это реализовать? Ибо это пока самый рабочий вариант. Без useeffect вообще дичь просходит, а с useeffect только в таком конфиге получилось заставить работать. Уже не первый день с этой проблемой бьюсь
источник

ᴀᴋ

ᴀʟᴇxᴀɴᴅʀ ᴋᴜᴢɴᴇᴛsᴏᴠ... in JavaScript — русскоговорящее сообщество
Все работает)) Спасибо большое тебе. Собственно я догадывался что проблема в этом и как ее примерно логически решить. Но сам бы в итоге не скоро наверное пришел к ее решению. Спасибо еще раз)
источник

AN

Andrey Nazarov in JavaScript — русскоговорящее сообщество
Привет, ребят, можно ли задеплоить чужой репозиторий к себе в гитхаб?
источник

SS

Sergiy Shatunov in JavaScript — русскоговорящее сообщество
Andrey Nazarov
Привет, ребят, можно ли задеплоить чужой репозиторий к себе в гитхаб?
можно форкнуть
источник

SS

Sergiy Shatunov in JavaScript — русскоговорящее сообщество
или подключить как субмодуль
источник

SS

Sergiy Shatunov in JavaScript — русскоговорящее сообщество
смотря что конкретно надо
источник

AN

Andrey Nazarov in JavaScript — русскоговорящее сообщество
Что значит форкнуть?
источник