等到内心的承诺完成

Waiting till inner promises are done

我想等待两个或更多 Promise 被阻止,只要有结果对我可用。

因此我使用了Promise.allSettled方法。如果两个 Promise 是平的,这就有效。但是,如果其中一个 Promise 由内部 Promise 组成,那么它将不起作用。

 Promise.allSettled([
  report?.getActivePage(), //return a Promise object
  exportVisualData("9df20366a984c945beb5")
 ])
  .then((results) => {
    results.forEach((result, index) => {
      if (result.status === "rejected") {
        const rejectedResult: PromiseRejectedResult =
          result as PromiseRejectedResult;
        console.log(rejectedResult);
      } else if (result.status === "fulfilled") {
        if (index === 0) {
          const fulfilledResult: PromiseFulfilledResult<Page | undefined> =
            result as PromiseFulfilledResult<Page | undefined>;
          console.log(fulfilledResult);
          fulfilledResult.value?.setActive();
        } else {
          const fulfilledResult: PromiseFulfilledResult<void | IExportDataResult> =
            result as PromiseFulfilledResult<void | IExportDataResult>;
          console.log(fulfilledResult);
        }
      }
   });

function exportVisualData(id: string): Promise<void | IExportDataResult> {
return report!.getPages().then((pages) => {
  pages.forEach((page) => {
    page.getVisuals().then((visualDescriptors) =>
      visualDescriptors.forEach((visualDescriptor) => {
        if (visualDescriptor.name === id) {
          if (!page.isActive) {
            page.setActive().then((__) => {
              return visualDescriptor?.exportData(
                ExportDataType.Summarized
              );
            });
          } else {
            return visualDescriptor?.exportData(ExportDataType.Summarized);
          }
        }
      })
    );
  });
});

Promise.allSettled 由于内心的承诺,第二次没有结果,我怎么能让它起作用。

{状态:'fulfilled',值:页} {状态:'fulfilled',值:未定义}

这是一个重写的 exportVisualData() 函数,它将满足您的 visualDescriptor.name 测试的任何结果收集到一个数组中,并使该数组成为 exportVisualData() returns 承诺的解析值.

我不知道 visualDescriptor?.exportData(ExportDataType.Summarized) returns 是否是承诺。以防万一,我在它前面放了一个 await 。如果它只是直接 returns 一个值,你可以删除 await.

此外,我不懂 TypeScript,因此您必须将类型信息添加到此代码中:

async function exportVisualData(id: string): Promise < void | IExportDataResult > {
    const results = [];
    const pages = await report!.getPages();
    for (let page of pages) {
        let visualDescriptors = await page.getVisuals();
        for (let visualDescriptor of visualDescriptors) {
            if (visualDescriptor.name === id) {
                if (!page.isActive) {
                    await page.setActive();
                }
                results.push(await visualDescriptor?.exportData(ExportDataType.Summarized));
            }
        }
    }
    return results;
}

请注意,这不会 运行 所有这些并行的异步操作,因此不需要对结果使用 Promise.allSettled()。它只是 returns 一个解析为值数组的承诺。

如果你想在这个函数中捕获错误并继续处理,你可以在每个循环中try/catch和在catchcontinue

如果您想 运行 并行处理所有内容,那么此处编码会更加困难,因为您 if (visualDescriptor.name === id) 想要跳过一些项目,所以您不知道自己有多少结果等到你深入了解结果。