javascript - 在 React 中与 JS Promises 作斗争
问题描述
我正在为Promise
JavaScript 中的概念而苦苦挣扎。我正在编写一个 React 应用程序,它GET
调用 Java 中的一个单独的 API 服务,我想将它的状态存储在一个useState()
钩子中。所以这是我的fetch
代码:
const ratingsUrl = "%URL%";
const base64 = require("base-64");
const login = "login";
const password = "password";
function fetchRatings() {
return fetch(ratingsUrl, {
method: "GET",
headers: new Headers({
Authorization: "Basic " + base64.encode(login + ":" + password),
}),
})
.then((response) => response.json())
.catch(handleError);
}
现在我试图将它的状态存储在我的页面组件中的一个钩子中:
function DisplayPage(){
const [ratings, setRatings] = useState(fetchRatings());
.
.
.
}
现在,数据返回但它在 a 中Promise
,因此导致错误:
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Array(20)
我需要做的是在钩子中初始化数据并将其返回,Table
以便我可以映射它。但是,每当我尝试做类似的事情时
ratings.map()
我在控制台中得到一个 TypeError 说ratings.Map is not a function
。
我知道该fetch
库异步返回数据,但我真正想要的只是将PromiseResult
其存储在一个useState()
钩子中,这样我就可以进一步对其执行操作。
解决方案
async
方法返回承诺。如果你直接在你的setRatings
状态变量中设置一个promise的结果,你会得到一个promise。
通常,这将被重写为:
function DisplayPage(){
const [ratings, setRatings] = useState(null);
useEffect(() => {
fetchRatings
.then(result => setRatings(result))
.catch(err => console.error(err));
}, []);
if (ratings === null) return <div>loading...</div>;
/* .. do your thing .. */
}
推荐阅读
- typescript - 在 Typescript 中将数组的元素相乘
- c# - 尝试使用模型反序列化时出现 Newtonsoft.Json.JsonSerializationException 问题
- swift - Swift - 为 imageView 创建具有 2 种不同颜色的阴影
- entity-framework-core - 如何将 ASP.NET 样板角色实体 ID 从 int 更改为 long
- video - ffmpeg 修剪并结合具有精确时间戳的同一视频的多个部分
- mysql - Windows Docker 无法通过套接字连接到本地 MySQL 服务器
- prettier - 更漂亮:可选的链接支持
- android - 无法在 Android 中使用 Retrofit 解析 JSON
- python - 简单的多线程服务器客户端程序
- reactjs - React Hook useEffect 缺少依赖项:'dispatch' 和 'init' - 在 useEffect 中使用 useDispach 时