【发布时间】:2021-05-20 19:02:43
【问题描述】:
我正在向这个 API 发出一个获取请求,并且我成功地获取了数据并将其打印到控制台。但是,我对 Javascript/React 中的异步调用不熟悉。如何在此代码中添加 async/await 以在成功获取时延迟渲染?我得到了经典的Uncaught (in promise) TypeError: Cannot read property '0' of undefined,因为我相信 DOM 正在尝试渲染尚未完全获取的数据。
import React, { useEffect, useState } from "react";
export default function News() {
const [error, setError] = useState(null);
const [isLoaded, setIsLoaded] = useState(false);
const [stories, setStory] = useState([]);
useEffect(() => {
fetch(
"http://api.mediastack.com/v1/news"
)
.then((res) => res.json())
.then(
(result) => {
setIsLoaded(true);
setStory(result);
console.log(result.data[0]); // printing to console to test response
console.log(result.data[0].title); // printing to console to test response
},
(error) => {
setIsLoaded(true);
setError(error);
}
);
}, []);
if (error) {
return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
return <div>Loading...</div>;
} else {
return (
<div>
<p>{stories.data[0].title} </p> // this is the where render error is
</div>
);
}
}
【问题讨论】:
-
您要发送 API 访问密钥吗?
-
是的,我是,但我为这篇文章删除了它,因为它对我来说是私人的。这不是最佳做法吗?不公开分享这些东西?
-
也许你可以让你的函数异步,然后用 await 调用它。
-
这正是我要寻求帮助的。我知道我需要 async/await 但无法正确实现。
-
尝试将
setStory(result);放在setIsLoaded(true);之前
标签: javascript reactjs asynchronous async-await fetch