Axios Retry Interceptor: автоматические повторы запросов с экспоненциальной заде
Одним вызовом подключает к любому экземпляру Axios «умные» повторы — полезно при временных сетевых сбоях и 5xx-ошибках сервера. Алгоритм экспоненциального back-off’а бережно нагружает API, ведь каждая следующая попытка ждёт в 2 раза дольше предыдущей.
import axios from 'axios';
/**
* Подключает к экземпляру Axios автоматический retry-механизм
* с экспоненциальным back-off’ом.
*
* @param {AxiosInstance} instance – созданный axios.create(...)
* @param {number} retries – максимум попыток (по умолчанию 3)
* @param {number} delay – базовая задержка в мс (по умолчанию 500)
*/
function setupAxiosRetry(instance, retries = 3, delay = 500) {
instance.interceptors.response.use(null, async error => {
const { config } = error;
if (!config || !retries) return Promise.reject(error);
config.__retryCount = config.__retryCount || 0;
if (config.__retryCount >= retries) return Promise.reject(error);
config.__retryCount += 1;
// экспоненциальный back-off: 0.5 s → 1 s → 2 s ...
await new Promise(res => setTimeout(res, delay * 2 ** (config.__retryCount - 1)));
return instance(config);
});
}
/* ───── Пример использования ───── */
const api = axios.create({ baseURL: 'https://api.example.com' });
setupAxiosRetry(api, 3, 300);
api.get('/data')
.then(res => console.log(res.data))
.catch(console.error);