【发布时间】:2021-08-02 04:25:26
【问题描述】:
我很困惑为什么我的异步函数在运行内部代码之前不等待。然后
例如,卡片应该是一个包含 102 个元素的数组。但是,console.log(cards.length) 显示为 0。此外,最后一个 .then 在任何元素放入卡片之前都会被原谅。
React.useEffect(() => {
// if (!cards.length) {
//https://api.pokemontcg.io/v2/cards?q=set.id:base1
async function fetchCards() {
const response = await fetch('https://api.pokemontcg.io/v2/cards?q=set.id:base1', {
mode: 'cors',
headers: {
'X-Api-key': '22173ccf-376e-4d12-8d50-8b25df6a8e13',
},
})
.then((res) => res.json())
.then((data) => {
console.log(data.data);
setCards(data.data);
console.log(cards.length);
})
.then(() => {
updateDeck(getRandom(cards, 4));
});
}
// }
fetchCards()
}, []);
【问题讨论】:
-
fetchCards 的主体不返回任何内容,因此第一个
.then()已经没有数据可以使用。而不是const response = await fetch(...)只是return fetch(...)。事实上,为什么还要有 fetchCards?只要有fetch(url, ...).then(response => response.json()).then(......),不需要声明和调用,你已经有了一个以fetch开头的promise链。 -
@Mike'Pomax'Kamermans 我编辑了代码,但它的长度仍然是 0。
-
cards来自哪里?您的then接受一个名为data的参数,而不是cards,因此您没有显示所有代码,我也不会猜测其余部分的作用。 如果 setCards 是一个状态函数,那么是的,显然关联的cards不会在下一行更新:它将在下一次渲染调用时更新,而不是之前。这就是 React 中状态更新的工作原理。 -
原谅我的无知。你的意思是我应该像这样包装 (res.json()) 来返回它吗?
-
卡片来自 useState 初始化 const [cards, setCards] = React.useState([]);
标签: javascript async-await promise