Текущий код:
Код: Выделить всё
function ChatRoom({ roomId }) {
const [messages, setMessages] = useState([]);
useEffect(() => {
const ws = new WebSocket(`wss://example.com/chat/${roomId}`);
ws.onmessage = (event) => {
setMessages(prev => [...prev, JSON.parse(event.data)]);
};
ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
}, [roomId]);
return {/* render messages */};
}
- Попытка 1. Добавление функции очистки для закрытия WebSocket:
Это выдает:
Код: Выделить всё
useEffect(() => { const ws = new WebSocket(`wss://example.com/chat/${roomId}`); ws.onmessage = (event) => { setMessages(prev => [...prev, JSON.parse(event.data)]); }; return () => { ws.close(); // Error: Cannot read property 'close' of undefined }; }, [roomId]);
TypeError: невозможно прочитать свойство close из неопределенного значения при размонтировании компонента. - Попытка 2: проверка ReadyState перед закрытием:
Это работает без ошибок, но Chrome DevTools по-прежнему показывает накопление нескольких подключений WebSocket, а использование памяти продолжает увеличиваться.
Код: Выделить всё
useEffect(() => { const ws = new WebSocket(`wss://example.com/chat/${roomId}`); ws.onmessage = (event) => { setMessages(prev => [...prev, JSON.parse(event.data)]); }; return () => { if (ws.readyState === WebSocket.OPEN) { ws.close(); } }; }, [roomId]);
При переключении между комнатами старое соединение WebSocket должно закрываться перед открытием нового.
Фактическое Поведение:
Использование памяти увеличивается при каждом переключении комнаты. При открытии вкладки DevTools Network отображается более 5 подключений WebSocket после многократного переключения комнат.
Среда:
- React 18.2.0
- Chrome 120
- Бэкенд Node.js с библиотекой ws
Подробнее здесь: https://stackoverflow.com/questions/798 ... ions-in-re
Мобильная версия