JavaScript: добавление функции ожидания/паузы через setTimeout

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Реализовать временную задержку выполнения кода на JavaScript возможно с использованием функции sleep, которая создаётся с помощью Promise и setTimeout. Взаимодействовать с ней следует через async/await:

JS
Скопировать код
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

async function delayedLog() {
  console.log('Ожидание — самое сложное...');
  await sleep(2000); // Пауза на 2 секунды, примерно как время ожидания за кофе ☕
  console.log('Наконец-то моя очередь!');
}

delayedLog();

Сначала код выполнит вывод сообщения "Ожидание — самое сложное...", затем установит двухсекундную паузу, и после скрипт выведет "Наконец-то моя очередь!".

Кинга Идем в IT: пошаговый план для смены профессии

Взгляд изнутри: Разбираемся с async/await

Функция, объявленная с ключевым словом async, возвращает Promise. Когда мы используем await, мы как бы приостанавливаем выполнение функции до тех пор, пока Promise не выполнится.

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

Возможные проблемы при использовании sleep

Чрезмерное применение sleep может привести к ухудшению пользовательского опыта из-за долгих перерывов в работе, напоминающих бесконечную рекламу на YouTube.

Практическое применение sleep/wait

Временные уведомления для пользователя

Ожидание позволяет пользователю внимательно прочитать уведомление, перед тем как оно исчезнет или обновится.

Плавные анимационные переходы

Применение функции sleep между шагами анимации помогает зрителю лучше усвоить каждый этап действия.

Вызовы API и регулировка нагрузки

Введение пауз между операциями с использованием API помогает избежать перегрузок, снижая напряжение как для системы, так и для пользователя.

Распространенные ошибки и способы их устранения

Неверное понимание setTimeout

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

Зацикливание колбэков

Остерегайтесь глубоко вложенных колбэков с использованием setTimeout, чтобы ваш код не стал похожим на «ад колбэков».

Блокировка основного потока выполнения

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

Визуализация

Механизм работы функции sleep можно наглядно проиллюстрировать на примере светофора:

JS
Скопировать код
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function sequentialFlow() {
  console.log("🚦 Красный цвет — стоп!");
  await sleep(3000); // Задержка в 3 секунды, например, время придумывания идеи.
  console.log("🟢 Зеленый цвет — можно ехать!");
}

sequentialFlow();

Таким образом, мы видим ситуацию, аналогичную движению в "час пик":

JS
Скопировать код
До `await sleep`:  🚗🚗🚗(Остановка на красный)
После `await sleep`:   🚗🚗🚗(Движение по зелёному)

Как в жизни: переходим из красного света в зелёный и дорога открыта для движения.

Готовые решения

Promise и отложенное выполнение

Вы можете использовать цепочки Promise с .then вместо async/await:

JS
Скопировать код
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

console.log('Немного подождите...');
sleep(2000).then(() => {
  console.log('Дождались! 🎉');
});

Генераторы

Для сложного управления потоками выполнения sleep можно применить генераторы JavaScript:

JS
Скопировать код
function* generatorSleepWorkflow() {
  console.log('Шаг 1: Начинаем с двух кружочков ⚫⚫');
  yield sleep(2000);
  console.log('Шаг 2: Добавляем детали — и это сова 🦉');
  yield sleep(2000);
  console.log('Вот и готово!');
}

const iterator = generatorSleepWorkflow();
iterator.next().value.then(() => iterator.next());

setInterval: применяйте аккуратно!

setInterval работает как перманентный будильник. Крайне важно аккуратно применять этот метод и не забывать вызывать clearInterval, чтобы не попасть в "День сурка".

Полезные материалы