<MyRusakov.ru />

Программирование на C++ в Unreal Engine 5

Программирование на C++ в Unreal Engine 5

Данный курс научит Вас созданию игр на C++ в Unreal Engine 5. Курс состоит из 12 разделов, в которых Вас ждёт теория и практика. Причём, в качестве практики будет создан весьма крупный проект объёмом свыше 5000 строк качественного кода, который уже на практике познакомит Вас с принципами создания игр на C++ в Unreal Engine 5.

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

Помимо самого курса Вас ждёт ещё и очень ценный Бонус: «Тестирование Unreal-проектов на Python», в рамках которого Вы научитесь писать очень полезные тесты для тестирования самых разных аспектов разработки игр.

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

setTimeout и setInterval в JavaScript: таймеры, задержки и правильная очистка

setTimeout и setInterval в JavaScript: таймеры, задержки и правильная очистка

setTimeout и setInterval в JavaScript — базовые инструменты для работы со временем: показать уведомление через пару секунд, обновлять счётчик, сделать автосохранение, отложить тяжёлую операцию или запустить периодический опрос сервера. Тема кажется простой, но именно с таймерами часто возникают баги: функция вызывается сразу, интервал не очищается, а код продолжает работать после закрытия модального окна.

Что такое setTimeout

setTimeout запускает функцию один раз после указанной задержки. Задержка задаётся в миллисекундах: 1000 мс = 1 секунда.

setTimeout(function() {
  console.log('Прошла 1 секунда');
}, 1000);

Современный вариант со стрелочной функцией:

setTimeout(() => {
  console.log('Сообщение появилось с задержкой');
}, 1500);

Важно: JavaScript не «останавливается» на время таймера. Он регистрирует отложенную задачу и продолжает выполнять следующий код.

console.log('Первый');

setTimeout(() => {
  console.log('Третий');
}, 1000);

console.log('Второй');

Результат будет: Первый, Второй, затем через секунду Третий.

Как отменить setTimeout

setTimeout возвращает идентификатор таймера. Его можно сохранить и передать в clearTimeout, если выполнение больше не нужно.

const timerId = setTimeout(() => {
  console.log('Это сообщение не появится');
}, 3000);

clearTimeout(timerId);

Практический пример: пользователь начал действие, но отменил его до завершения задержки.

let saveTimer = null;

function scheduleSave() {
  clearTimeout(saveTimer);

  saveTimer = setTimeout(() => {
    console.log('Данные сохранены');
  }, 1000);
}

scheduleSave();
scheduleSave();
scheduleSave();

Здесь старый таймер каждый раз отменяется, поэтому сохранение произойдёт только один раз — через секунду после последнего вызова.

Что такое setInterval

setInterval запускает функцию не один раз, а регулярно через заданный промежуток времени.

const intervalId = setInterval(() => {
  console.log('Прошла ещё одна секунда');
}, 1000);

Такой код будет работать бесконечно, пока вы не остановите его через clearInterval.

const intervalId = setInterval(() => {
  console.log('Тик');
}, 1000);

setTimeout(() => {
  clearInterval(intervalId);
  console.log('Интервал остановлен');
}, 5000);

Практический пример: обратный отсчёт

Один из самых понятных примеров использования setInterval — таймер обратного отсчёта.

let secondsLeft = 5;

const countdownId = setInterval(() => {
  console.log(secondsLeft);
  secondsLeft--;

  if (secondsLeft < 0) {
    clearInterval(countdownId);
    console.log('Время вышло');
  }
}, 1000);

Главное правило: если интервал должен закончиться, условие остановки нужно продумать заранее. Иначе он будет выполняться постоянно и расходовать ресурсы.

setTimeout вместо setInterval: когда так лучше

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

function pollServer() {
  console.log('Запрашиваем данные...');

  setTimeout(() => {
    console.log('Планируем следующий запрос');
    pollServer();
  }, 3000);
}

pollServer();

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

Типичные ошибки с таймерами

1. Функция вызывается сразу

Новички часто случайно вызывают функцию вместо того, чтобы передать её в таймер.

function showMessage() {
  console.log('Привет');
}

setTimeout(showMessage(), 1000); // ошибка
setTimeout(showMessage, 1000);   // правильно

В первом случае showMessage() выполнится немедленно, а результат её выполнения попадёт в setTimeout.

2. Потеря идентификатора таймера

Если вы не сохранили результат setInterval, остановить конкретный интервал будет сложно.

const id = setInterval(() => {
  console.log('Работаем');
}, 1000);

clearInterval(id);

3. Ожидание идеальной точности

Задержка в таймерах — это не гарантия выполнения ровно через указанное время. Если основной поток занят, callback выполнится позже. Поэтому не стоит строить точные часы только на увеличении счётчика каждую секунду. Для точного времени лучше сравнивать текущую дату с начальной.

const startedAt = Date.now();

setInterval(() => {
  const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);
  console.log('Прошло секунд:', elapsedSeconds);
}, 1000);

Передача аргументов в setTimeout

Аргументы можно передать после задержки, но на практике чаще используют стрелочную функцию — так код читается понятнее.

function greet(name) {
  console.log('Привет, ' + name);
}

setTimeout(greet, 1000, 'Анна');

setTimeout(() => {
  greet('Иван');
}, 1000);

Рекомендации по использованию таймеров

  • Всегда сохраняйте идентификатор таймера, если его нужно будет отменять.
  • Очищайте интервалы при закрытии модальных окон, смене экранов или удалении компонента.
  • Не используйте setInterval для операций, которые могут выполняться дольше интервала.
  • Для точного измерения времени опирайтесь на Date.now(), а не только на количество срабатываний.
  • Не передавайте строку кода в таймер: setTimeout('alert(1)', 1000) — плохая практика.

Если вы хотите не просто запомнить синтаксис, а уверенно понимать асинхронность, DOM, события, формы и работу с реальными проектами, посмотрите курс «JavaScript с нуля до уровня уверенного разработчика» — он хорошо дополняет такие базовые темы практикой.

Краткий итог

setTimeout выполняет код один раз с задержкой, а setInterval запускает его регулярно. Для отмены используются clearTimeout и clearInterval. Самая важная привычка — контролировать жизненный цикл таймеров: запускать их осознанно и вовремя очищать. Тогда таймеры в JavaScript будут полезным инструментом, а не источником скрытых ошибок.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.