Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
async_await [2023/08/09 20:15] tro |
async_await [2024/02/06 18:27] (текущий) tro |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== async / await ====== | ====== async / await ====== | ||
| - | ===== Обява | + | Синтактическая надстройка над промисами. |
| + | Зручний спосіб написання асинхронного коду, який ззовні схожий на синхронний. Цей механізм був доданий до стандарту ECMAScript 2017 (ES8) і став дуже популярним серед розробників завдяки його зручності та зрозумілості. Будь-яка функція може бути асинхронною. | ||
| + | ===== async ===== | ||
| + | ==== Обява ==== | ||
| < | < | ||
| async function asyncFn(){ | async function asyncFn(){ | ||
| Строка 11: | Строка 14: | ||
| } | } | ||
| </ | </ | ||
| - | ===== Виклик | + | Для оголошення асинхронного методу об' |
| - | Приклад 1 нормальне повернення | + | < |
| + | const user = { | ||
| + | async getUsername() { | ||
| + | // ... | ||
| + | }, | ||
| + | }; | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | Для оголошення асинхронного методу класу також використовується async перед іменем методу. | ||
| + | < | ||
| + | class User { | ||
| + | async getUsername() { | ||
| + | // ... | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | ==== Виклик ==== | ||
| + | **Приклад 1** нормальне повернення | ||
| < | < | ||
| asyncFn() | asyncFn() | ||
| | | ||
| </ | </ | ||
| - | Приклад 2 повернення помилки | + | **Приклад 2** повернення помилки |
| < | < | ||
| const asyncFn = async()=> | const asyncFn = async()=> | ||
| Строка 27: | Строка 49: | ||
| | | ||
| </ | </ | ||
| - | Приклад 3 Очикування результату промісу та виконання асінхронного виклику | + | **Приклад 3** Очикування результату промісу та виконання асінхронного виклику |
| < | < | ||
| const timerPromise =()=> | const timerPromise =()=> | ||
| Строка 42: | Строка 64: | ||
| console.log(' | console.log(' | ||
| </ | </ | ||
| + | **Приклад 4** | ||
| + | Якщо не вказувати значення для повернення, | ||
| + | < | ||
| + | const foo = async () => { | ||
| + | // Не вказуємо значення для повернення | ||
| + | }; | ||
| + | |||
| + | foo().then(value => { | ||
| + | console.log(value); | ||
| + | }); | ||
| + | |||
| + | </ | ||
| + | ===== 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(); | ||
| + | </ | ||
| + | |||