我有一个对象,我们将其称为pages
,其中每个键(typeOne
,typeTwo
等)的值是一个对象数组-一个键名为formData
的对象是未决的Promise。我想本质上更新pages
对象,以使每个formData
键都是promise的解析值。
我基本上可以通过映射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
})()
是否有一种干净的方式编写此代码,使其立即等待所有Promises,然后用已解决的值替换Promise?
答案 0 :(得分:0)
您需要两个 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;
})
)
))
不需要迭代库。
确保不要像for (type of
那样隐式创建全局变量-这样会污染全局范围或在严格模式下引发错误。