首页 > 解决方案 > 在一个对象中等待并返回所有已解决的承诺值

问题描述

我有一个我们将调用的对象pages,其中每个键 ( , 等...) 的typeOnetypeTwo是一个对象数组 - 并且该对象中的一个键称为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?

标签: javascriptpromiseasync-await

解决方案


你需要两个 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- 这会污染全局范围或在严格模式下抛出错误。


推荐阅读