等到内心的承诺完成
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和在catch
中continue
。
如果您想 运行 并行处理所有内容,那么此处编码会更加困难,因为您 if (visualDescriptor.name === id)
想要跳过一些项目,所以您不知道自己有多少结果等到你深入了解结果。
我想等待两个或更多 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和在catch
中continue
。
如果您想 运行 并行处理所有内容,那么此处编码会更加困难,因为您 if (visualDescriptor.name === id)
想要跳过一些项目,所以您不知道自己有多少结果等到你深入了解结果。