Не могу получить данные с помощью Axios и реагировать, получая обещание и неопределенное

#reactjs #axios

#реагирует на #аксиос

Вопрос:

Я пытаюсь получить некоторые данные с помощью Axios и реагировать, но у меня возникли проблемы с разрешением обещания и установкой его на состояние, это странно.

Вот база:

 export const fetchUserById = (username) =gt; client.get(`/${username}`);  

Вот этот звонок:

 export const getUserById = async (username) =gt; {  try {  const response = await api.fetchUserById(username);  const data = await response.data;  return data;  } catch (error) {  return error;  } };  

Вот в React:

 const [user, setUser] = useState();    useEffect(() =gt; {  const data = getUserById(params.username); // this gets the username and its working  setUser(data)  }, [])   useEffect(() =gt; {  console.log("this is user: ", user)  }, [user])  

Если я консолирую пользователя журнала, я получаю неопределенные данные, Если я консолирую данные журнала, я получаю обещание.

Ответ №1:

getUserById объявлен async таким образом, что он неявно возвращает обещание, на котором абоненты должны либо await использовать цепочку обещаний, либо использовать ее.

 useEffect(() =gt; {  const data = getUserById(params.username);  setUser(data); // lt;-- logs only the returned Promise object! }, [])  

async/await

 useEffect(() =gt; {  const getUser = async () =gt; {  try {  const data = await getUserById(params.username);  setUser(data);  } catch(error) {  // handle error, log, etc...  }  };   getUser(); }, []);  

Цепочка обещаний

 useEffect(() =gt; {  getUserById(params.username)  .then(data =gt; {  setUser(data);  })  .catch(error =gt; {  // handle error, log, etc...  });  }; }, []);  

Ответ №2:

Или вы могли бы с таким же успехом сделать:

 useEffect(() =gt; {  // fetch data  (async () =gt; {  try {  const data = await getUserById(params.username);  // set state  setUser(data)   } catch(error) {  // handle error, log, etc...  // set init state  setUser(null)   }  })();   }, []);