我有一個呼叫異步函式的包裝器:
function fetchAPI(arg1: number, arg2: number, arg3: string) {
return new Promise((resolve, reject) => {
try {
myFetchFunction(arg1, arg2, arg3).then((r: any) => {
if (!r) {
reject("Error 01")
}
resolve(r)
})
} catch {
reject("Error 01")
}
})
}
由于我正在查詢的 API 非常不穩定,因此fetchAPI
函式拒絕經常發生。
因此,我創建了另一個fetchAPI
呼叫undefined
. 而如果它經歷了 3 次中的任何一次,它只會以正確的回應解決。
function fetchAPIRepeat(arg1: number, arg2: number, arg3: string, n: number = 0) {
return new Promise((resolve) => {
fetchAPI(arg1, arg2, arg3).then((r) => {
resolve(r)
}).catch(() => {
if(n < 3) {
console.log("Partial error: " n)
sleep(1000).then(() => {
resolve(fetchAPIRepeat(arg1, arg2, arg3, n 1))
})
} else {
resolve(undefined)
}
})
})
}
這作業得很好。但是,我想創建一個“通用包裝器”,它可以作為fetchAPIRepeat
函式運行,但對于任何 promise 函式,我都會通過它。
這是我嘗試過的,但它不起作用:
function promiseRepeatWrapper(fn: (...args: any[]) => Promise<any>, n: number = 0, ...args: any[]) {
return new Promise((resolve) => {
fn(args).then((r) => {
resolve(r)
}).catch(() => {
if(n < 3) {
console.log("Partial error: " n)
sleep(1000).then(() => {
resolve(this.errorWrapper(fn, n 1, args))
})
} else {
resolve(undefined)
}
})
})
}
“不起作用”是指控制臺記錄了 3 次“部分錯誤”,然后以未定義的方式解決,盡管確保承諾在所有 3 次都正確通過:
Partial error: 0
Partial error: 1
Partial error: 2
除了幫助我修復該功能之外,我還對我的 promise-repeat 模式的錯誤處理設計改進感興趣。
謝謝。
uj5u.com熱心網友回復:
這可以通過 async/await 來實作。您不需要再次傳遞該引數。你可以這樣做會更通用的方法。哪里可以傳誰重試多少次,重試后等待多少時間
這是一個打字稿playgorund
const waitFor = (timeout: number): Promise<void> => {
return new Promise((resolve) => {
setTimeout(() => resolve(), timeout);
});
}
async function retryPromise<T>(fn: () => Promise<T>, repeat = 3, retryAfter = 1000): Promise<T> {
let currentAttpmt = 1;
while(currentAttpmt <= 3) {
try {
return await fn();
} catch (e) {
currentAttpmt = 1;
await waitFor(retryAfter);
}
}
//it failed 3 times in a row
throw new Error("Cannot do this");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/523609.html
標籤:打字稿