javascript - 在一个对象中等待并返回所有已解决的承诺值
问题描述
我有一个我们将调用的对象pages
,其中每个键 ( , 等...) 的typeOne
值typeTwo
是一个对象数组 - 并且该对象中的一个键称为formData
待处理的 Promise。我想从本质上更新pages
对象,使每个formData
键都是承诺的已解决值。
通过基本上映射其中的每个值,我已经成功地做到了pages
这一点 - 但是,这很慢,因为似乎type*
在移动到下一个集合之前等待并解析每个数组集,如果这有任何意义的话。
(async () => {
let pages = {
typeOne: [
{
formData: Promise<pending>
},
...
],
...
}
...
for (type of _.keys(pages)) {
pages[type] = await Promise.all(pages[type].map(async page => {
page.formData = await page.formData;
return page;
}));
}
...
// do stuff with pages
})()
是否有干净的方法来编写它,以便它立即等待所有 Promise,然后用已解决的值替换 Promise?
解决方案
你需要两个 Promise.all
;一个迭代键,另一个嵌套一个迭代每个页面:
const resolvedPages = {};
await Promise.all(Object.entries(pages).map(([key, typeArr]) =>
Promise.all(typeArr.map(
// Wait for each individual Promise to resolve, then map to a new object
({ formData }) => formData.then(({ resolveValue }) => ({ formData: resolveValue }))
)
.then((resolvedArrOfObjs) => {
resolvedPages[key] = resolvedArr;
})
)
))
不需要迭代库。
确保不要隐式创建全局变量,例如 with for (type of
- 这会污染全局范围或在严格模式下抛出错误。
推荐阅读
- laravel - 嵌套的雄辩关系
- dll - Uno WASM 在使用 DLL 时无法解析包
- javascript - NW.js 中的 nvm-windows Node.js 版本更改
- javascript - 使用Javascript遍历无序列表
- postgresql - 如何从包含数组的某个键的 jsonb 列中获取 uniq 数据?
- vue.js - 在 Nuxt JS 中重新加载页面后路由参数值消失
- c++ - 如何在 C++ 中调试未捕获的异常核心转储
- javascript - document.write 是否删除 css 样式?
- c# - 我需要根据类型做一件特定的事情,不知道如何实现它
- c# - asp.net core MapControllerRoute 与我的路由不匹配(未触发授权)