await в обробнику події
1. Базове правило
await можна використовувати тільки всередині функції, оголошеної з async.
Це означає, що якщо обробник події - звичайна функція, await усередині неї викличе помилку:
button.addEventListener('click', () => {
await fetch('/api/data'); // SyntaxError
});Щоб це працювало, потрібно оголосити обробник як async:
button.addEventListener('click', async () => {
const response = await fetch('/api/data');
const data = await response.json();
console.log(data);
});Тепер усе законно - браузер зачекає fetch усередині обробника,
але сама подія не "заморожує" UI: решта коду продовжує виконуватися.
2. Приклад використання await в обробнику
<button id="load">Завантажити дані</button>
<div id="result"></div>
<script>
const btn = document.querySelector('#load');
const result = document.querySelector('#result');
btn.addEventListener('click', async () => {
result.textContent = 'Завантаження...';
try {
const res = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const post = await res.json();
result.textContent = post.title;
} catch (err) {
result.textContent = 'Помилка завантаження';
}
});
</script>Що відбувається:
- при кліку запускається
async-обробник; await fetch(...)призупиняє виконання всередині функції;- після завантаження дані відображаються;
- при цьому інтерфейс не блокується (JS залишається асинхронним).
3. Можна також оголосити окрему async-функцію
Іноді зручніше винести логіку окремо:
async function handleClick() {
const data = await fetchData();
render(data);
}
button.addEventListener('click', handleClick);Працює точнісінько так само.
4. Важливо пам'ятати
-
Обробники подій не чекають результату
await. ТобтоaddEventListenerне знає, що всередині обробника єawait. Код поза обробником продовжить виконуватися одразу після виклику. -
Помилки всередині
async-обробника потрібно ловити черезtry/catch, інакше вони підуть уPromiseі можуть залишитися непоміченими:javascriptbtn.addEventListener('click', async () => { try { await riskyOperation(); } catch (e) { console.error('Помилка:', e); } }); -
event.preventDefault()іstopPropagation()працюють одразу, незалежно відawait- їх можна викликати до асинхронних операцій.
Підсумок
| Питання | Відповідь |
|---|---|
Чи можна використовувати await в обробнику? | Так, якщо він async |
Чи можна оголосити await без async? | Ні |
| Чи блокує це інтерфейс? | Ні |
| Чи потрібно ловити помилки? | Так, через try/catch |
Чи можна виносити async-функцію окремо? | Так, кращий стиль |
Запам'ятай просто:
awaitусередині обробника - це нормально, головне, щоб обробник бувasync, а помилки були оброблені.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.