reactjs - 如果我尝试使用 API 响应数据更新我的状态,为什么会开始无限循环?
问题描述
我对 Promise 和异步代码有点缺乏经验,我正在使用 API 调用构建我的第一个项目。
我的情况是这样的:我必须第一次调用 Spotify API 以获取身份验证令牌,然后再次调用它以使用此令牌获取我的数据。
这是我的代码:
const FeaturedAlbums = () => {
const [featuredAlbums, setFeaturedAlbums] = useState([]);
const getToken = async () => {
const params = new URLSearchParams();
params.append("grant_type", "client_credentials");
const res = await axios({
method: "post",
url: "https://accounts.spotify.com/api/token",
headers: {
Authorization: `Basic ${process.env.REACT_APP_ENCODED_KEY}`,
},
data: params,
});
const accessToken = res.data.access_token;
return accessToken;
};
const getFeaturedAlbums = async (token) => {
const res = await axios({
method: "get",
url: "https://api.spotify.com/v1/browse/new-releases",
headers: {
Authorization: `Bearer ${token}`,
},
params: {
limit: 6,
},
});
const albums = res.data.albums.items;
// console.log(albums);
const myAlbums = albums.map((album) => ({
artist: album.artists[0].name,
img: album.images[1].url,
title: album.name,
}));
console.log(myAlbums);
return myAlbums;
};
useEffect(async () => {
const myToken = await getToken();
console.log(myToken);
const newAlbums = await getFeaturedAlbums(myToken);
setFeaturedAlbums(newAlbums);
});
我肯定在做一些非常错误的承诺,但我需要一些提示。非常感谢!!!
解决方案
首先,您useEffect
没有依赖关系,我相信这就是导致无限循环的原因。如官方文档中所述,第一次渲染后和每次更新后都会运行一个useEffect
钩子。尝试传递一个空数组作为钩子的第二个参数,你的钩子将在第一次渲染后运行一次。[]
useEffect(() => {
// your code here
}, []) // <-- empty array
此外,这不是你应该在钩子中使用异步的方式。您应该在 hook 中定义您的 async 函数,然后立即调用它,如下所示:
useEffect(() => {
async function myAsyncFunc() {
// do all the async job here
}
myAsyncFunc();
}, []);
推荐阅读
- javascript - Vue .sync 仅适用于 v-model,但会出现突变错误
- javascript - 有没有办法在 http 请求中组合文件?
- c++ - 模拟按键 x 毫秒
- xamarin - 无法为 UIMainStoryboardFile 实例化默认视图控制器
- python - if int(lista[2]) == 0: IndexError: list index out of range
- pandas - 得到 TypeError:字符串索引必须是带有 .apply 的整数
- django - Django 错误 - /listings/1 处的 NoReverseMatch。未找到带有参数“(”,)“的“添加评论”的反向操作。(创建评论部分)
- swift - 当您在 SKSpriteNode 上使用 SKAction 时,哪个位置值会发生变化?我将如何解释职位变化?
- excel - Excel VBA - 下载的带有 url 的 csv 文件,但它只显示 html 代码而不是 csv 文件的实际内容
- javascript - 如何在 Angular 应用程序中实现 Async 或 Promise(计算量大)