javascript - 在 For 循环中使用异步函数
问题描述
我有一个数组,我需要为每个索引调用一个 API 端点。解决后,我需要将其附加到该元素中。一旦完成数组的每个索引,我想返回更新的数组。
我尝试以这种方式使用 async-await
// Let input be [{'x': 1, 'y': 2}, {'x': 11, 'y': 22}, ...]
async function hello(input) {
await input.forEach(element => {
fetch(url, options)
.then((res) => {
element['z'] = res
})
})
return input
}
我需要使用这个函数来更新我的状态
hello(data)
.then((res: any) => {
this.setState((prevState) => ({
...prevState,
inputData: res,
}))
})
问题是我需要一个更多的强制渲染来显示键“z”。如何解决这个问题?我没有太多使用异步等待的经验,所以我不确定我是否正确使用它。
解决方案
正确的方法是使用Promise.all
并返回调用者函数使用的 promise,因为您希望将整个更新的输入值设置为 state。
在您的情况下, forEach 不会返回承诺,因此等待它是无用的。
此外,如果您在 forEach 函数中使用 await,您需要能够在所有承诺都解决后让 hello 函数的 .then 方法调用。Promise.all 为您做到这一点
function hello(input) {
const promises = [];
input.forEach(element => {
promises.push(
fetch(url, options)
.then(res => res.json()
.then((result) => {
// return the updated object
return {...element, z: result};
})
)
});
return Promise.all(promises);
}
...
hello(data)
.then((res: any) => {
this.setState((prevState) => ({
...prevState,
inputData: res,
}))
})
PS 请注意,来自 fetch 的响应也需要调用res.json()
推荐阅读
- c++ - 删除双链表中的节点不起作用
- node.js - Browsersync 不断加载,从不实际加载页面
- python - 如何用硒单击表格中的元素?
- amazon-web-services - 使用 Microsoft 进行 SS0 身份验证时,使用在 AWS ECS 集群上运行的 keycloak 获取 IDENTITY_PROVIDER_LOGIN_ERROR
- r - quadprog::solve.QP 参数的使用和确定
- vba - 使用 VBA 为 powerpoint 的每张幻灯片添加水印
- flutter - 未来构建器中的颤振过滤器数据列表
- vba - 使用 VBA 获取 OneDrive 上文件夹中的 Excel 文件列表
- c# - ASP.NET Core 在页面上显示数据库中的所有行
- sql - SQL 连接提示影响行数?