typescriptapifetchnetworkretry
Fetch with Retry
Fetch wrapper with exponential backoff retry logic. Handles transient network errors gracefully.
Code
interface RetryOptions {
maxRetries?: number;
baseDelay?: number;
maxDelay?: number;
}
async function fetchWithRetry(
url: string,
options?: RequestInit,
retryOptions: RetryOptions = {}
): Promise<Response> {
const { maxRetries = 3, baseDelay = 1000, maxDelay = 10000 } = retryOptions;
let lastError: Error;
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
const response = await fetch(url, options);
// Retry on 5xx errors
if (response.status >= 500 && attempt < maxRetries) {
throw new Error(`Server error: ${response.status}`);
}
return response;
} catch (error) {
lastError = error instanceof Error ? error : new Error(String(error));
if (attempt < maxRetries) {
// Exponential backoff with jitter
const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
const jitter = delay * 0.1 * Math.random();
await new Promise(r => setTimeout(r, delay + jitter));
}
}
}
throw lastError!;
}
// Usage
const response = await fetchWithRetry('/api/data', {
method: 'GET',
}, { maxRetries: 5 });