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 }
);
Create a free account and build your private vault. Share publicly whenever you want.