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