@baroman4ik

Как дождаться выполнения асинхронной функции для изменения стейта в React?

есть асинхронный метод, который получает дату и есть стейт-массив, от которого зависит отрисовка всего другого. как дождаться ответа от getData в данном случае?

const App = async () => {
  const [noteArr, setNoteArr] = useState([])
  setNoteArr(getData())
  useEffect(() => {
    return () => {
      console.log(noteArr);
    };
  }, [noteArr]);
  return (
    <div className="App">
      <NoteInfo/>
      <NoteList noteArr={noteArr} setNoteArr={setNoteArr}/>
    </div>
  );
}
  • Вопрос задан
  • 1188 просмотров
Решения вопроса 1
@Denioo
Асинхронные функции должны вызываться в useEffect в таком случае. Поместите setNoteArr(getData()) в useEffect с пустыми зависимостями [] и он будет вызываться при монтировании компонента.

Вообще ваш компонент должен выглядеть так:

const App = () => {
  const [noteArr, setNoteArr] = useState([])

useEffect(() => {
    (async () => {
    const result = await getData();
setNoteArr(result);
   })()
  }, []);

  useEffect(() => {
    return () => {
      console.log(noteArr);
    };
  }, [noteArr]);
  return (
    <div className="App">
      <NoteInfo/>
      <NoteList noteArr={noteArr} setNoteArr={setNoteArr}/>
    </div>
  );
}


Тогда все будет работать как надо и читаемость улучшится
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
CriticalError
@CriticalError
Самоучка
Ваш ответ не совсем корректен, так как данный способ не заставляет дожидаться выполнения асинхронной функции, если поставите debagger слазу после
useEffect(() => {
    (async () => {
    const result = await getData();
setNoteArr(result);
   })()
  }, []);
то вы сможете убедиться что noteArr = []
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы