Асинхронность в JavaScript: setTimeout, Promise, async/await

Как использовать setTimeout, Promise и async/await в JavaScript. Пошаговое обучение для начинающих. Примеры.

Введение в асинхронность в JavaScript

Асинхронность позволяет выполнять операции, которые занимают время (например, загрузку данных или таймеры), не блокируя основной поток выполнения кода. Это важно, чтобы интерфейс сайта оставался отзывчивым и не «замораживался».

В этом уроке мы рассмотрим три основных способа работы с асинхронным кодом в JavaScript:

  • setTimeout — запуск кода с задержкой,
  • Promise — объект, который представляет результат асинхронной операции,
  • async/await — современный синтаксис для удобной работы с промисами.

1. setTimeout — выполнение кода с задержкой

Для чего нужно: иногда нужно отложить выполнение функции на определённое время. Например, показать сообщение через 3 секунды.

Пример кода:

Скопировать
setTimeout(() => {
  alert("Прошло 3 секунды!");
}, 3000);

Что происходит: функция внутри setTimeout выполнится через 3000 миллисекунд (3 секунды).

2. Promise — объект для работы с асинхронностью

Для чего нужно: Promise помогает отследить завершение асинхронной операции и её результат (успех или ошибка).

Пример создания и использования Promise:

Скопировать
const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    const success = true; // Можно менять на false для проверки ошибки
    if (success) {
      resolve("Операция успешна!");
    } else {
      reject("Произошла ошибка.");
    }
  }, 2000);
});

myPromise
  .then(result => {
    console.log(result); // Выведет "Операция успешна!" через 2 секунды
  })
  .catch(error => {
    console.error(error); // Выведет ошибку, если success = false
  });

Что происходит: создаётся Promise, который через 2 секунды либо выполняется успешно (resolve), либо с ошибкой (reject).

3. async/await — удобный синтаксис для работы с Promise

Для чего нужно: упрощает чтение и написание асинхронного кода, делая его похожим на обычный синхронный.

Пример с async/await:

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

async function asyncExample() {
  console.log("Ждём 2 секунды...");
  await wait(2000);
  console.log("Прошло 2 секунды!");
}

asyncExample();

Что происходит: функция asyncExample ждёт 2 секунды с помощью await, не блокируя остальной код.

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

Давайте сделаем простой таймер обратного отсчёта с использованием setTimeout и async/await.

Скопировать
<div id="countdown">5</div>
<button id="refreshBtn"><i class="fa fa-refresh"></i></button>

<script>
function wait(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function countdown(seconds) {
  const display = document.getElementById("countdown");
  for(let i = seconds; i >= 0; i--) {
    display.textContent = i;
    await wait(1000);
  }
  display.textContent = "Время вышло!";
}

document.getElementById("refreshBtn").addEventListener("click", () => {
  location.reload();
});

countdown(5);
</script>

Попробуйте прямо здесь:

5

Совет: Асинхронность — важная тема в JavaScript, не бойтесь экспериментировать и использовать промисы и async/await, чтобы писать чистый и понятный код.

Что дальше

В следующем уроке мы рассмотрим, как с помощью fetch получать данные с сервера и работать с ними.