reactjs - 反应useEffect如何确定循环中的多个异步任务何时完成
问题描述
我有一个奇怪的场景,我有一个 useEffect 从服务器检索数据,然后在我的应用程序中设置状态。奇怪的是,我让它在 for 循环中针对它检测到的设备数量执行此操作。每次迭代的数据大小范围相当大,并导致异步反应异常。这没关系,因为它是最佳的,但我如何才能确定 useEffect 何时完成。我已经尝试过了,但由于每次迭代的随机数据大小,它们在不同的时间出现,我无法正确记录它......
useEffect(() => {
// this grabs all historical data only if the indexDB does NOT exist
if (indexDBExists.userExists === false && devices.devices !== null) {
console.log("getAllHistoricalData() mounted")
let valueArray = []
let keyArray = []
for (let i=0; i<devices.devices.length; i++){
getAllHistoricalData(devices.devices[i]).then((res) => {
valueArray.push(res)
keyArray.push(devices.devices[i])
if (i === devices.devices.length - 1){
const counter = allHistoricalData.done + 1
setAllHistoricalData({values: valueArray, keys: keyArray, done: counter})
}else{
const counter = allHistoricalData.done + 1
setAllHistoricalData({values: valueArray, keys: keyArray, done: counter})
}
}).catch((err) => {
console.log(err)
})
}
}
return () => {
console.log("getAllHistoricalData() un-mounted")
};
}, [indexDBExists.user, devices.devices]);
如您所见,我已尝试创建一个计数器,以后可以使用该计数器与 devices.devices 的长度进行比较。但是,这不起作用,因为计数器变量是在异步任务之前创建的,并且在 setState 时不是最新的。我怎样才能知道这个 useEffect 何时完成?
解决方案
推荐阅读
- javascript - 如何处理nodejs中的内部查询?
- c# - 如何在“Setup”/“Verify”中使用“out”参数来模拟类方法?
- reactjs - 使用 moxios 使用 queryParams 模拟 axios 获取请求
- firebase - 删除的 Firestore 数据不会减少存储的数据配额
- jquery - 如何从该函数中获取键 => 值对中的值
- python - 如何对两个元组列表求和
- java - 如何在 Map java 中允许重复值?
- c# - C# 属性分配错误
- mongodb - DynamoDB 等效于 find().sort()
- javascript - 我如何将文本区域的内容限制为文本区域的高度?