Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: retry, error handling, async, promise, network request

Как реализовать retry без сторонних библиотек?

Этот вопрос проверяет умение реализовать повторные попытки выполнения операций, что критично для обработки временных сбоев в сетевых запросах или взаимодействии с внешними сервисами.

Короткий ответ

Retry можно реализовать, обернув асинхронную операцию в цикл с ограничением по количеству попыток и задержкой между ними. Создайте функцию, которая принимает другую функцию (операцию), максимальное число попыток и параметры задержки. Внутри используйте try/catch: при успехе возвращаем результат, при ошибке — увеличиваем счетчик, ждем (например, через setTimeout или промис с задержкой) и повторяем. Важно обрабатывать только повторяемые ошибки (например, сетевые таймауты), а не фатальные (например, 404).

Длинный ответ

Механизм повторных попыток (retry) используется, когда операция может временно завершиться неудачей из-за нестабильности сети, перегрузки сервера или других временных проблем. Вместо того чтобы сразу сообщать об ошибке пользователю, система делает несколько попыток выполнить действие, что повышает надежность приложения.

Основные компоненты реализации

Для создания retry-логики без библиотек нужно определить несколько ключевых параметров:

  • Максимальное количество попыток: чтобы не зацикливаться бесконечно.
  • Стратегия задержки: например, постоянная пауза, экспоненциальная задержка (exponential backoff) или случайная (jitter) для избежания "толпы" запросов.
  • Условия для повтора: не все ошибки стоит повторять (например, ошибка 400 "Bad Request" не исправится при повторе, а 503 "Service Unavailable" — может).

Пример реализации на JavaScript

Ниже приведена функция retry для асинхронных операций, возвращающих Promise. Она использует экспоненциальную задержку и проверку типа ошибки.

async function retry(operation, maxAttempts = 3, delayMs = 1000) {
  let lastError;
  
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    try {
      // Пытаемся выполнить операцию
      return await operation();
    } catch (error) {
      lastError = error;
      // Проверяем, стоит ли повторять (например, только сетевые ошибки)
      if (!isRetryableError(error) || attempt === maxAttempts) {
        throw new Error(`Failed after ${attempt} attempts: ${error.message}`);
      }
      
      // Экспоненциальная задержка: delayMs * 2^(attempt-1)
      const waitTime = delayMs * Math.pow(2, attempt - 1);
      console.log(`Attempt ${attempt} failed. Retrying in ${waitTime}ms...`);
      await sleep(waitTime);
    }
  }
}

// Вспомогательная функция для паузы
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

// Пример проверки ошибки на возможность повтора
function isRetryableError(error) {
  // Сетевые ошибки или 5xx статусы обычно повторяемы
  return error.code === 'ECONNRESET' || 
         error.code === 'ETIMEDOUT' || 
         (error.response && error.response.status >= 500);
}

// Использование
async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
  return response.json();
}

// Вызов с retry
retry(fetchData, 4, 1000)
  .then(data => console.log('Data:', data))
  .catch(err => console.error('Final error:', err));

Где применять и ограничения

Retry-логика полезна при вызовах внешних API, запросах к базам данных или любых операциях ввода-вывода, где возможны временные сбои. Однако важно не применять её слепо:

  • Избегайте повторов для идемпотентных операций (например, GET-запросов), чтобы не создавать лишнюю нагрузку.
  • Для неидемпотентных операций (POST, DELETE) убедитесь, что повтор не приведет к дублированию или нежелательным побочным эффектам.
  • Всегда настраивайте разумные лимиты попыток и задержек, чтобы не блокировать пользователя надолго.

Вывод: Реализация retry без библиотек позволяет гибко контролировать стратегию повторных попыток и лучше понять механизм обработки ошибок. Используйте её для повышения устойчивости приложений, работающих с ненадежными внешними сервисами, но всегда учитывайте идемпотентность и характер ошибок.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#retry

#error handling

#async

#promise

#network request

Подпишись на Java Developer в телеграм