Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
async_await [2024/02/05 20:16] tro |
async_await [2024/02/06 18:27] (текущий) tro |
||
|---|---|---|---|
| Строка 2: | Строка 2: | ||
| Синтактическая надстройка над промисами. | Синтактическая надстройка над промисами. | ||
| Зручний спосіб написання асинхронного коду, який ззовні схожий на синхронний. Цей механізм був доданий до стандарту ECMAScript 2017 (ES8) і став дуже популярним серед розробників завдяки його зручності та зрозумілості. Будь-яка функція може бути асинхронною. | Зручний спосіб написання асинхронного коду, який ззовні схожий на синхронний. Цей механізм був доданий до стандарту ECMAScript 2017 (ES8) і став дуже популярним серед розробників завдяки його зручності та зрозумілості. Будь-яка функція може бути асинхронною. | ||
| - | ===== Обява | + | ===== async ===== |
| + | ==== Обява ==== | ||
| < | < | ||
| async function asyncFn(){ | async function asyncFn(){ | ||
| Строка 13: | Строка 14: | ||
| } | } | ||
| </ | </ | ||
| - | ===== Виклик | + | Для оголошення асинхронного методу об' |
| + | < | ||
| + | const user = { | ||
| + | async getUsername() { | ||
| + | // ... | ||
| + | }, | ||
| + | }; | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | Для оголошення асинхронного методу класу також використовується async перед іменем методу. | ||
| + | < | ||
| + | class User { | ||
| + | async getUsername() { | ||
| + | // ... | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | ==== Виклик ==== | ||
| **Приклад 1** нормальне повернення | **Приклад 1** нормальне повернення | ||
| < | < | ||
| Строка 56: | Строка 76: | ||
| </ | </ | ||
| + | ===== await ===== | ||
| + | Всередині асинхронних функцій можна використовувати оператор await, розмістивши його праворуч від будь-якого виразу, | ||
| + | Коли інтерпретатор зустрічає await, він призупиняє виконання функції і чекає, доки не завершиться виконання промісу, | ||
| + | < | ||
| + | const foo = async () => { | ||
| + | console.log(" | ||
| + | |||
| + | const promiseValue = await new Promise(resolve => { | ||
| + | setTimeout(() => resolve(5), 2000) | ||
| + | }); | ||
| + | |||
| + | console.log(" | ||
| + | }; | ||
| + | |||
| + | foo(); // через 2 секунди виведеться в консоль | ||
| + | |||
| + | </ | ||
| + | Вже .then не потрібна і повернеться саме значення результат функції а не проміс | ||
| + | ===== HTTP-запити ===== | ||
| + | Використаємо синтаксис async/await при роботі з HTTP-запитами, | ||
| + | < | ||
| + | const fetchUsers = async () => { | ||
| + | const response = await axios.get("< | ||
| + | return response.data; | ||
| + | }; | ||
| + | |||
| + | fetchUsers() | ||
| + | .then(users => console.log(users)); | ||
| + | |||
| + | </ | ||
| + | ===== Обробка помилок ===== | ||
| + | Якщо результат асинхронної функції (проміс) не використовується в зовнішньому коді, помилки оброблюються у самому тілі функції за допомогою конструкції try...catch. Значення параметра error у блоці catch — це помилка, | ||
| + | < | ||
| + | const fetchUsers = async () => { | ||
| + | try { | ||
| + | const response = await axios.get("< | ||
| + | console.log(response.data); | ||
| + | } catch(error) { | ||
| + | console.log(error); | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | </ | ||
| + | ====== Приклади ====== | ||
| + | ===== Виконання декількох запитів HTTP асінхронно ===== | ||
| + | < | ||
| + | async function f1(){ | ||
| + | const url = ' | ||
| + | |||
| + | //сам запит до сервера робимо аасинхронно для швидкості | ||
| + | const p1 = fetch(url); | ||
| + | const p2 = fetch(url); | ||
| + | const p3 = fetch(url); | ||
| + | const p4 = fetch(url); | ||
| + | const p5 = fetch(url); | ||
| + | |||
| + | // | ||
| + | const promise = [p1, | ||
| + | |||
| + | //а тепер у результат кладемо результати проміі і чекаємо тільки коли усі вони виконаються | ||
| + | const result = await Promise.allSettled(promise); | ||
| + | |||
| + | console.log(result) | ||
| + | } | ||
| + | |||
| + | // | ||
| + | f1(); | ||
| + | </ | ||
| + | |||