import { asyncUtils } from "https://deno.land/x/dtils@2.6.1/deps.ts";
const { retry } = asyncUtils;
Calls the given (possibly asynchronous) function up to maxAttempts
times.
Retries as long as the given function throws.
If the attempts are exhausted, throws an RetryError
with cause
set to the inner exception.
The backoff is calculated by multiplying minTimeout
with multiplier
to the power of the current attempt counter (starting at 0 up to maxAttempts - 1
). It is capped at maxTimeout
however.
How long the actual delay is, depends on jitter
.
When jitter
is the default value of 1
, waits between two attempts for a randomized amount between 0 and the backoff time.
With the default options the maximal delay will be 15s = 1s + 2s + 4s + 8s
. If all five attempts are exhausted the mean delay will be 9.5s = ½(4s + 15s)
.
When jitter
is 0
, waits the full backoff time.
Examples
Example 1
Example 1
import { retry } from "https://deno.land/std@0.224.0/async/mod.ts";
const req = async () => {
// some function that throws sometimes
};
// Below resolves to the first non-error result of `req`
const retryPromise = await retry(req, {
multiplier: 2,
maxTimeout: 60000,
maxAttempts: 5,
minTimeout: 100,
jitter: 1,
});
Example 2
Example 2
import { retry } from "https://deno.land/std@0.224.0/async/mod.ts";
const req = async () => {
// some function that throws sometimes
};
// Make sure we wait at least 1 minute, but at most 2 minutes
const retryPromise = await retry(req, {
multiplier: 2.34,
maxTimeout: 80000,
maxAttempts: 7,
minTimeout: 1000,
jitter: 0.5,
});