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

Что такое async/await?

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

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

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

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

Async/Await в JavaScript — синтаксический сахар для Promise

Async/Await — это современный способ написания асинхронного кода, который выглядит синхронным, но работает асинхронно.

История развития

// ❌ Callback hell
function fetchUserData(id, callback) {
  fetch(`/api/users/${id}`)
    .then(res => res.json())
    .then(user => {
      fetch(`/api/posts/${user.id}`)
        .then(res => res.json())
        .then(posts => callback(posts))
    })
}

// ✅ Async/Await (современно)
async function fetchUserData(id) {
  const user = await fetch(`/api/users/${id}`).then(r => r.json());
  const posts = await fetch(`/api/posts/${user.id}`).then(r => r.json());
  return posts;
}

Синтаксис

async function getData() {
  const data = await fetch('/api/data');
  return data;
}

const promise = getData(); // Всегда возвращает Promise

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

// С Promise (старо)
fetch('/api/data')
  .then(res => res.json())
  .catch(error => console.error(error));

// С async/await (более читаемо)
async function fetchData() {
  try {
    const response = await fetch('/api/data');
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('Error:', error);
  }
}

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

// ❌ Неправильно — последовательно (медленно)
async function slowFetch() {
  const user = await fetch('/api/user').then(r => r.json());
  const posts = await fetch('/api/posts').then(r => r.json());
  const comments = await fetch('/api/comments').then(r => r.json());
  // Время: 3 * delay
}

// ✅ Правильно — параллельно (быстро)
async function fastFetch() {
  const [user, posts, comments] = await Promise.all([
    fetch('/api/user').then(r => r.json()),
    fetch('/api/posts').then(r => r.json()),
    fetch('/api/comments').then(r => r.json())
  ]);
  // Время: 1 * delay
}

Backend пример

app.get('/users/:id', async (req, res) => {
  try {
    const user = await db.query(
      'SELECT * FROM users WHERE id = $1',
      [req.params.id]
    );
    
    if (!user.rows[0]) {
      return res.status(404).json({ error: 'Not found' });
    }
    
    const posts = await db.query(
      'SELECT * FROM posts WHERE user_id = $1',
      [req.params.id]
    );
    
    res.json({
      user: user.rows[0],
      posts: posts.rows
    });
  } catch (error) {
    res.status(500).json({ error: 'Internal server error' });
  }
});

Важные правила

// 1. await работает только в async функции
async function getData() {
  const data = await fetch('/api/data');
  return data;
}

// 2. Всегда обрабатывай ошибки
async function safeFetch() {
  try {
    return await fetch('/api/data');
  } catch (error) {
    console.error(error);
    throw error;
  }
}

// 3. Promise.all() для параллельных операций
const [user, posts] = await Promise.all([
  getUser(id),
  getPosts(id)
]);

// 4. Promise.race() для таймаутов
const result = await Promise.race([
  fetch('/api/data'),
  new Promise((_, reject) =>
    setTimeout(() => reject(new Error('Timeout')), 5000)
  )
]);

Key takeaway

  • Async/Await = синтаксический сахар для Promise
  • Код выглядит синхронным, работает асинхронно
  • Всегда обрабатывай ошибки через try/catch
  • Promise.all() для параллельных операций
  • Избегай последовательных await без необходимости
Что такое async/await? | PrepBro