Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: setTimeout, async await, promise, delay, retry logic

Как добавить задержку между попытками выполнения функции?

Вопрос проверяет умение управлять временем выполнения асинхронных операций, что необходимо для реализации повторных попыток (retry logic) при работе с ненадёжными API или сетевыми запросами.

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

Задержку между попытками выполнения функции можно добавить с помощью setTimeout в колбэк-стиле или используя Promise с async/await. Самый простой способ — создать функцию delay, которая возвращает промис, разрешающийся через заданное время. Затем в цикле или рекурсивной функции, реализующей повторные попытки, вызывать await delay(ms) перед следующей попыткой. Это позволяет избежать блокировки основного потока и делает код читаемым.

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

Добавление задержки между попытками выполнения функции — распространённая задача при реализации повторных попыток (retry logic) для обработки временных сбоев, например, при сетевых запросах или взаимодействии с внешними API. Основная цель — не "заспамить" сервер запросами и дать ему время на восстановление.

Основные подходы

В JavaScript, который работает в одном потоке, нельзя использовать синхронные паузы (например, цикл while с Date.now()), так как это заблокирует весь интерфейс. Вместо этого используют асинхронные механизмы:

  • setTimeout/callback: классический способ, но может привести к "callback hell".
  • Promise + async/await: современный и предпочтительный подход, делающий код линейным и легко читаемым.

Практическая реализация

Сначала создадим вспомогательную функцию delay, которая возвращает промис, разрешающийся через указанное количество миллисекунд.

function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

Затем её можно использовать внутри асинхронной функции, которая выполняет основную операцию с повторными попытками.

async function fetchWithRetry(url, maxAttempts = 3, delayMs = 1000) {
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    try {
      const response = await fetch(url);
      if (!response.ok) throw new Error(`HTTP ${response.status}`);
      return await response.json();
    } catch (error) {
      console.log(`Attempt ${attempt} failed: ${error.message}`);
      if (attempt === maxAttempts) throw error;
      // Добавляем задержку перед следующей попыткой
      await delay(delayMs);
    }
  }
}

// Использование
// fetchWithRetry('https://api.example.com/data');

В этом примере между неудачными попытками будет пауза в 1 секунду (1000 мс). Задержку можно сделать экспоненциальной (exponential backoff), умножая delayMs на коэффициент после каждой неудачи, что является лучшей практикой для распределённых систем.

Где применяется

Такой подход применяется при:

  • Работе с нестабильными сетевыми соединениями.
  • Вызовах внешних API, которые могут возвращать ошибки 429 (Too Many Requests) или 503 (Service Unavailable).
  • Операциях с базой данных, которые могут временно завершиться сбоем из-за высокой нагрузки.
  • Любых фоновых задачах, где требуется устойчивость к временным неудачам.

Итог: Используйте асинхронную функцию задержки на основе Promise внутри цикла или рекурсии с повторными попытками. Это делает код чистым, неблокирующим и является стандартом для обработки временных сбоев в современной JavaScript-разработке.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

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

#setTimeout

#async await

#promise

#delay

#retry logic

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

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.