#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) } })(); }, []);