我正在尝试通过productId从后端获取productInfo。我正在迭代productId并使用axios获取数据。但它每次编译只迭代一个元素。我如何在一次执行中迭代所有这些?
const useBasket = (location) => {
const [products, setProducts] = useState([]);
const [descriptions, setDescriptions] = useState([]);
console.log("ACCOUNT ID:", location.location.state.accountId);
useEffect(() => {
const getBasket = async () => {
const basketResponse = await Axios.get("http://localhost:8084/accountId/" + location.location.state.accountId);
setProducts(basketResponse.data.products);
};
const getProductInfo = async (props) => {
console.log("INSIDE getProductInfo:",props);
const productResponse = await Axios.get("http://localhost:8081/product/" + props).catch(err => console.log(err));
setDescriptions([...descriptions,productResponse.data.description]);
}
getBasket();
for(let i = 0; i < products.length; i++){
console.log("INSIDE FOR:",products[i]);
getProductInfo(products[i]);
}
}, []);
console.log("DESCRIPTIONS:",descriptions);
return { descriptions };
};
我试着把for循环放在async函数里面。之后,我在for循环中调用了await函数。
我还把加载部分时,数据不完整,它不会返回。
但都没用。
3条答案
按热度按时间tjrkku2a1#
状态更新是异步的,闭包捕获每个状态变量的当前值(在同一个闭包中不会改变)。您应该直接访问响应中的值,并使用
await
来确保在获取描述之前完成对产品的请求。下面是实现它的一种方法:
9vw9lbht2#
getBasket
是一个异步函数。执行不会等待它完成/返回才继续。这意味着你的for循环引用了一个不太可能被更新的产品状态变量。有很多方法可以解决这个问题(假设您不能简单地修改产品获取以包括描述):
getBasket
Package 在promise中,并在迭代之前等待它。getBasket
中合并getProductInfo
函数并迭代basketResponse.data.products
yeotifhr3#
这里有几件事可以改变,它们都归结为如何处理不会立即发生的事情,比如:
1.调用发送API请求的async函数(您确实要等待axios返回值,但不必等待整个async函数完成,因此for循环部分在请求完成之前就开始执行)
1.在setState之后使用state(这不是瞬时的,setState调用是批量处理并一起执行的,它是如此之快,以至于只有在编写在setState调用之后使用state的代码时,您才会注意到这种情况)
现在,可能有不同的方法来解决这个问题,但这里有一个变化最小的解决方案:
getBasket
和getProductInfo
被移到useEffect
之外(可选,为了可读性)getBasket
还在完成时返回数据1.在
getBasket
调用之前添加了await