Skip to main content
Deno 2 is finally here 🎉️
Learn more
Module

x/dtils/deps.ts>asyncUtils.retry

The best unofficial library of utilities for Deno applications
Latest
function asyncUtils.retry
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

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

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,
});

Parameters

fn: (() => Promise<T>) | (() => T)
optional
opts: RetryOptions