我想等待兩個或更多的 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 在第二個沒有結果,我怎么能讓它作業。
{狀態:'已完成',值:頁面} {狀態:'已完成',值:未定義}
uj5u.com熱心網友回復:
這是一個重寫的exportVisualData()函式,它將滿足您的visualDescriptor.name測驗的任何結果收集到一個陣列中,并使該陣列成為exportVisualData()回傳的承諾的決議值。
我不知道是否visualDescriptor?.exportData(ExportDataType.Summarized)回傳承諾。如果是這樣,我會await在它前面放一個。如果它只是直接回傳一個值,則可以將其洗掉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()在結果上使用。它只回傳一個決議為一組值的承諾。
如果你想捕捉錯誤,并保持在這個函式處理,你可以嘗試/捕獲在每個回圈和continue在catch。
如果您想并行運行所有內容,則在此處撰寫代碼會更加困難,因為您if (visualDescriptor.name === id)想跳過某些專案,因此在深入了解結果之前您不知道正在等待多少結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/375622.html
上一篇:打字稿函式回傳型別
