Перехватывать реакцию, устанавливать переменные и печатать с тем же эффектом использования

#reactjs #socket.io #react-hooks

#reactjs #socket.io #реагирующие перехваты

Вопрос:

Я хочу задать имя, переменную room после вызова axios и перед socket.join. Но setName () не работает должным образом, и socket.join() не получает новое значение Name, Room. Имя и значение комнаты, установленные после socket.join(), завершены, но я хотел установить имя и значение комнаты перед socket.join()

 useEffect(() => {
    (async () => {
      const response = await axios({
        method: "get",
        url: "https://localhost:5000/",
        mode: "cors",
        withCredentials: true,
      });
      const data = await response.data;
      await condition_check();
      await soc();
      function condition_check() {
        return new Promise(async (resolve) => {
          if (location.state === undefined) {
            SetConnected(true);
            SetValid(false);
          }
          if (data.status === "ok" amp;amp; location.state !== undefined) {
            SetName(location.state.Name, () => {
              console.log(name);
            });
            SetRoom(location.state.Room);
            SetUserId(location.state.UserId);
            SetValid(true);
            resolve(console.log("1", name, room));
            SetConnected(true);
            SetSetup(true);
          }
        });
      }
      function soc() {
        return new Promise((resolve) => {
          if (setup === true) {
            socket = socketIOClient.connect(ENDPOINT);
            socket.emit(
              "Join",
              { Name: name, Room: room, UserId: userid },
              (err) => {
                if (err) {
                  alert(err);
                }
              }
            );
            console.log("2", name, room);
            socket.on("message", ({ Name, Room, message, currenttime }) => {
              setMessages((messages) => [...messages, message]);
              setSenders((senders) => [...senders, Name]);
              setTime((time) => [...time, currenttime]);
              resolve(console.log(currenttime));
            });
          }
        });
      }
    })();
  

Ответ №1:

 // because `SetRoom` `SetName` is async

useEffect(() => {
    (async () => {
      const response = await axios({
        method: "get",
        url: "https://localhost:5000/",
        mode: "cors",
        withCredentials: true,
      });
      const data = await response.data;
      let NAME;
      let ROOM;
      await condition_check();
      await soc();
      function condition_check() {
        return new Promise(async (resolve) => {
          if (location.state === undefined) {
            SetConnected(true);
            SetValid(false);
          }
          if (data.status === "ok" amp;amp; location.state !== undefined) {
            ...
            NAME = location.state.Name
            ROOM = location.state.Room
            ...
          }
        });
      }
      function soc() {
        // use local variable `ROOM` and `NAME`
        return new Promise((resolve) => {
          ...
        });
      }
    })();
  

Комментарии:

1. Это работает, нужна просто логика. Это решило мои многие будущие проблемы.

2. так в чем ваша проблема

3. У меня возникли проблемы с использованием нового значения переменной состояния в том же useeffect. Теперь решено