← Назад к вопросам

Зачем нужен async/await?

1.0 Junior🔥 281 комментариев
#Node.js и JavaScript

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужен async/await?

async/await — это синтаксический сахар для работы с промисами, который делает асинхронный код похожим на синхронный. Это одна из самых важных фич современного JavaScript/Node.js.

Проблемы, которые решает async/await

Callback Hell (адский ад колбэков):

// Без async/await - адский ад вложенности
fs.readFile("file1.txt", (err, data1) => {
  if (err) throw err;
  fs.readFile("file2.txt", (err, data2) => {
    if (err) throw err;
    fs.readFile("file3.txt", (err, data3) => {
      if (err) throw err;
      console.log(data1, data2, data3);
    });
  });
});

С async/await — чистый и понятный код:

async function readFiles() {
  try {
    const data1 = await fs.promises.readFile("file1.txt");
    const data2 = await fs.promises.readFile("file2.txt");
    const data3 = await fs.promises.readFile("file3.txt");
    console.log(data1, data2, data3);
  } catch (err) {
    throw err;
  }
}

Основные преимущества

  1. Читаемость — код выглядит синхронным, его легче понять и поддерживать
  2. Обработка ошибок — используем стандартный try/catch, не нужны .catch() цепочки
  3. Отладка — стэк трейс содержит реальное место ошибки, а не только последний промис
  4. Контроль потока — легко использовать if/else, for, while в асинхронном коде

Как это работает

async функция автоматически возвращает промис:

async function getData() {
  return 42; // вернёт Promise.resolve(42)
}

getData().then(result => console.log(result)); // 42

await приостанавливает выполнение функции:

async function main() {
  console.log("старт");
  const result = await Promise.resolve(42); // ждём результат
  console.log("результат:", result); // это выполнится только после результата
  console.log("конец");
}

main();
// Вывод: старт → (пауза) → результат: 42 → конец

Параллельное выполнение

Неправильно — медленно:

async function slow() {
  const r1 = await fetch("/api/1"); // ждём 1сек
  const r2 = await fetch("/api/2"); // ждём ещё 1сек
  return [r1, r2]; // всего 2сек
}

Правильно — быстро:

async function fast() {
  const [r1, r2] = await Promise.all([
    fetch("/api/1"),
    fetch("/api/2")
  ]); // оба запроса параллельно, всего ~1сек
  return [r1, r2];
}

Обработка ошибок

async function example() {
  try {
    const result = await someAsyncOperation();
    return result;
  } catch (err) {
    console.error("Ошибка:", err.message);
    // обработка ошибки
  } finally {
    // выполнится в любом случае
  }
}

Реальный пример в Express

app.get("/users/:id", async (req, res) => {
  try {
    const user = await db.query("SELECT * FROM users WHERE id = ?", [req.params.id]);
    if (!user) return res.status(404).json({ error: "Not found" });
    res.json(user);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

Заключение: async/await сделал JavaScript асинхронный код понятнее и безопаснее. Это стандарт современной разработки на Node.js.