JavaScript

Retry Promise with Backoff

by @admin
10h ago
Apr 28, 2026
Public
Retries a Promise-returning function up to a specified number of times with configurable exponential backoff and optional jitter. Accepts a shouldRetry predicate so you can skip retries on specific error types (e.g. 401 Unauthorized). Returns the resolved value or re-throws the last error after exhausting retries.
JavaScript
async function retryWithBackoff(fn, {
  retries    = 3,
  baseDelay  = 300,
  maxDelay   = 5000,
  jitter     = true,
  shouldRetry = () => true,
} = {}) {
  let lastErr;
  for (let attempt = 0; attempt <= retries; attempt++) {
    try {
      return await fn(attempt);
    } catch (err) {
      lastErr = err;
      if (attempt === retries || !shouldRetry(err, attempt)) throw err;
      let delay = Math.min(baseDelay * 2 ** attempt, maxDelay);
      if (jitter) delay *= (0.5 + Math.random() * 0.5);
      await new Promise((r) => setTimeout(r, delay));
    }
  }
  throw lastErr;
}

// Usage
const data = await retryWithBackoff(
  () => fetch('/api/data').then((r) => r.json()),
  { retries: 4, shouldRetry: (err) => err.status !== 401 }
);
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.