From aa0b91347b59d50d23bb737a08cd9a1984ccf483 Mon Sep 17 00:00:00 2001 From: Elmer Bulthuis Date: Tue, 5 Nov 2019 14:34:47 +0100 Subject: [PATCH] onerror --- src/retry.spec.ts | 8 ++++++-- src/retry.ts | 11 +++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/retry.spec.ts b/src/retry.spec.ts index e1e34ba..6e55a40 100644 --- a/src/retry.spec.ts +++ b/src/retry.spec.ts @@ -10,7 +10,11 @@ test("does not retry when told not to", async (t) => { } }, {}, - _ => (triesLeft-- > 0), + error => { + if (triesLeft-- <= 0) { + throw error; + } + }, ); t.doesNotThrow(retryLogic, "did not retry when no tries were left"); @@ -22,7 +26,7 @@ test("forwards error to caller", async (t) => { throw new Error("InnerError"); }, {}, - _ => false, + error => { throw error; }, ); } catch (err) { t.equal(err.message, "InnerError", "error messages match"); diff --git a/src/retry.ts b/src/retry.ts index a2f2cd6..e51490b 100644 --- a/src/retry.ts +++ b/src/retry.ts @@ -16,7 +16,7 @@ export const defaultRetryConfig = { export async function retry( job: (attempt: number) => PromiseLike | T, config: RetryConfig = {}, - shouldTryAgain = (error: any) => true, + onError = (error: any) => undefined as void, control?: Promise, ): Promise { const { @@ -42,16 +42,19 @@ export async function retry( catch (error) { if ( !(error instanceof CancelError) && - retryAttempt < retryLimit && - shouldTryAgain(error) + retryAttempt < retryLimit ) { + onError(error); error = null; } if (error) throw error; } // https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ - intervalCurrent = Math.min(intervalCap, randomBetween(intervalBase, intervalCurrent * 3)); + intervalCurrent = Math.min( + intervalCap, + randomBetween(intervalBase, intervalCurrent * 3), + ); await delay(intervalCurrent, control); retryAttempt++;