等待并返回对象中所有已解决的promise值

时间:2019-11-19 03:00:48

标签: javascript promise async-await

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

1 个答案:

答案 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那样隐式创建全局变量-这样会污染全局范围或在严格模式下引发错误。