#javascript #reactjs #socket.io
#javascript #reactjs #socket.io
Вопрос:
Я читал, что setState является асинхронным, но я не вижу, что здесь это так, потому что я могу зарегистрировать «particip» на консоли. Все остальные setStates находятся в состоянии ожидания. Я не понимаю, почему только setParticipants ничего не делает. Вначале я подумал, что, поскольку «particip» — это массив объектов, я делаю что-то не так. Позже я попробовал с простыми буквами и цифрами, просто чтобы посмотреть, будет ли обновлено состояние или нет. К моему большому удивлению, ничего не происходило, и я, честно говоря, не понимаю, почему.
const [participants, setParticipants] = useState();
useEffect(() => {
const socket = io(BASE_URL);
setSocket(socket);
socket.on("msgToClient", (msg) => {
setChat((chat) => [...chat, { ...msg }]);
});
socket.on("joinedRoom", (particip) => {
console.log(particip);
setParticipants(particip);
console.log(participants);
});
socket.on("leftRoom", (particip) => {
console.log(particip);
setParticipants(particip);
console.log(participants);
});
}, []);
Комментарии:
1. Где
setState
вызов?2. Да,
setParticipants
это выполняется асинхронноsetParticipants(particip)
иconsole.log(participants)
сразу после этого всегда будут отображаться старые данные. Чего вы пытаетесь достичь?3. Чтобы гарантировать, что когда я вызываю setParticipants, он будет выполнен, и состояние будет установлено, поэтому я могу его использовать. Хотя я не понимаю, как работает другой setChat и устанавливает его состояние без проблем.