Що робить await?
Коротке визначення
await- це оператор, який зупиняє виконанняasync-функції до того часу, поки проміс не виконається (fulfilled) або не відхилиться (rejected).Після цього:
- якщо проміс виконано успішно,
awaitповертає його результат;- якщо проміс відхилено,
awaitкидає помилку (аналогthrow).
Синтаксис
let result = await promise;Працює тільки всередині async-функцій (або в top-level await у модулях).
Приклад 1 - очікування проміса
async function example() {
console.log('Перед await');
const result = await Promise.resolve('Готово');
console.log('Після await:', result);
}
example();Вивід:
Перед await
Після await: Готовоawait чекає виконання проміса і повертає 'Готово'.
Приклад 2 - помилка через await
async function fail() {
try {
const res = await Promise.reject('Помилка!');
} catch (err) {
console.error('Спіймали:', err);
}
}
fail();Вивід:
Спіймали: Помилка!Якщо проміс відхилено, await кидає виняток,
тому помилки зручно ловити через try...catch.
Приклад 3 - послідовне виконання
async function steps() {
console.log('1');
await new Promise(res => setTimeout(res, 1000));
console.log('2');
await new Promise(res => setTimeout(res, 1000));
console.log('3');
}
steps();Вивід:
1
(через 1 сек)
2
(через 1 сек)
3Кожен await дочікується виконання попереднього проміса,
тому код працює послідовно.
Приклад 4 - паралельне виконання (без await всередині)
async function parallel() {
const a = fetch('/api/user');
const b = fetch('/api/posts');
// Обидва виконуються одночасно
const [user, posts] = await Promise.all([a, b]);
console.log('Обидва запити завершені');
}Якщо поставити await перед кожним запитом,
вони виконаються по черзі, а не паралельно.
Як await працює всередині Event Loop
Коли рушій зустрічає await promise:
- Зупиняє виконання поточної
async-функції. - Реєструє продовження (решту коду) як мікрозавдання.
- Звільняє основний потік (інший код може виконуватися).
- Коли проміс завершується, мікрозавдання запускає код, що залишився.
Тому await не "блокує" JS,
він просто відкладає продовження функції до готовності проміса.
Приклад 5 - "пауза" без блокування
async function wait() {
console.log('Початок');
await new Promise(res => setTimeout(res, 2000));
console.log('Кінець');
}
wait();
console.log('Цей код виконується, поки триває очікування!');Вивід:
Початок
Цей код виконується, поки триває очікування!
(через 2 сек)
Кінецьawait не блокує потік, а тільки саму функцію.
Приклад 6 - з не-промісами
Якщо передати звичайне значення, воно одразу обгортається в Promise.resolve():
async function demo() {
const result = await 42;
console.log(result);
}
demo(); // 42Це потрібно для уніфікації - await завжди працює так, ніби це проміс.
Приклад 7 - вкладені await
async function inner() {
return 'Всередині';
}
async function outer() {
const res = await inner();
console.log('Результат:', res);
}
outer();Вивід:
Результат: ВсерединіОскільки inner() повертає проміс, await просто чекає його завершення.
Проста аналогія
Уяви, що await - це пауза на світлофорі:
- Коли загорається червоний (
Promise pending), ти чекаєш. - Коли зелений (
fulfilled), продовжуєш шлях. - Коли аварія (
rejected), виникає помилка, і ти переходиш уcatch.
Підсумок
| Особливість | Опис |
|---|---|
| Що робить | Зупиняє async-функцію, поки проміс не завершиться |
| Повертає | Результат resolve або кидає помилку при reject |
| Де можна використовувати | Тільки всередині async-функцій (або top-level await у модулях) |
| Не блокує | Решта коду програми продовжує виконуватися |
| Працює з | Промісами і звичайними значеннями (Promise.resolve(value)) |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.