Асинхронность/ожидание (async/await) в TypeScript
В этой статье объясняется использование async/await в TypeScript.
YouTube Video
Асинхронность/ожидание (async/await) в TypeScript
В TypeScript ключевое слово async используется для упрощенного описания асинхронных операций и ведет себя аналогично синтаксису async/await в JavaScript. Функции, определенные с помощью async, предназначены для более интуитивного управления функциями, возвращающими Promises.
Основы функций с использованием async
Функции, объявленные с ключевым словом async, всегда возвращают объект типа Promise. Пример базового использования:.
1async function fetchData(): Promise<string> {
2 return "Data received";
3}
4
5fetchData().then((data) => console.log(data)); // "Data received"
В этом примере, поскольку функция async всегда возвращает объект Promise, возвращаемое значение автоматически разрешается с помощью Promise.resolve. Другими словами, "Data received" превращается в Promise<string> и обрабатывается как асинхронная операция.
Ключевое слово await
Ключевое слово await можно использовать только внутри функции, объявленной с ключевым словом async. Это позволяет приостановить выполнение и дождаться результата Promise перед продолжением выполнения функции.
В следующем примере асинхронная обработка с использованием fetch написана с помощью async/await.
1async function getUserData() {
2 try {
3 const response = await fetch("https://codesparklab.com/json/example.json");
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error("Error fetching user data:", error);
8 }
9}
10
11getUserData();В этом примере ключевое слово await используется для ожидания завершения Promise, возвращаемого функцией fetch, и его результат присваивается переменной response. Далее, результат response.json() также обрабатывается с помощью await.
Обработка ошибок с использованием async/await
Ошибки, возникающие при асинхронной обработке, можно отлавливать с помощью стандартного синтаксиса try...catch. Если ошибка возникает на этапе использования await, она обрабатывается в блоке catch.
1async function fetchDataWithErrorHandling() {
2 try {
3 const response = await fetch('https://invalid.codesparklab.com/');
4 if (!response.ok) {
5 throw new Error(`HTTP error! status: ${response.status}`);
6 }
7 const data = await response.json();
8 console.log(data);
9 } catch (error) {
10 console.error("Fetch error:", error);
11 }
12}
13
14fetchDataWithErrorHandling();В приведенном выше примере результат вызова функции fetch обрабатывается с помощью await, а в случае возникновения ошибки она обрабатывается с использованием try...catch.
Преимущества async/await
-
Интуитивное асинхронное программирование: Использование
async/awaitделает поток выполнения кода более интуитивным, чем использование цепочекPromise(thenилиcatch), позволяя писать код, похожий на синхронный. -
Простота обработки ошибок: Использование
try...catchупрощает обработку ошибок в асинхронных операциях. Позволяет писать более читаемый код по сравнению с использованием цепочекPromise.
Возвращаемые значения функций async
Функция async всегда возвращает Promise. Таким образом, даже без явного возвращения Promise асинхронная обработка возможна с использованием ключевого слова async.
1async function example() {
2 return 42;
3}
4
5example().then((result) => console.log(result)); // 42
В приведённом выше коде возвращается синхронное значение 42, но так как оно внутри функции async, оно автоматически преобразуется в Promise.resolve(42).
Последовательное выполнение асинхронных функций
При выполнении нескольких асинхронных функций подряд можно использовать await для управления их порядком.
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function processData() {
19 const data1 = await fetchData1();
20 console.log(data1);
21
22 const data2 = await fetchData2();
23 console.log(data2);
24}
25
26processData();В этом примере fetchData2 выполняется после завершения fetchData1. Это более читаемо по сравнению с использованием цепочки Promise.
Параллельное выполнение
Если нужно выполнить асинхронные операции параллельно, можно использовать Promise.all для обработки нескольких Promise одновременно.
1async function fetchData(url: string): Promise<any> {
2 try {
3 const response = await fetch(url);
4 return await response.json();
5 } catch (error) {
6 console.error("Error fetching user data:", error);
7 }
8}
9
10async function fetchData1(): Promise<any> {
11 return await fetchData("https://codesparklab.com/json/example.json");
12}
13
14async function fetchData2(): Promise<any> {
15 return await fetchData("https://codesparklab.com/json/example2.json");
16}
17
18async function fetchMultipleData() {
19 const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
20 console.log(data1);
21 console.log(data2);
22}
23
24fetchMultipleData();В этом случае fetchData1 и fetchData2 выполняются одновременно, и процесс продолжается после того, как оба будут выполнены. Это позволяет эффективно обрабатывать несколько асинхронных операций.
Резюме
- Функция
asyncвозвращаетPromise, и с помощью ключевого словаawaitможно дождаться результата асинхронной операции. - С использованием
try...catchобработка ошибок в асинхронных операциях становится проще. - С использованием
Promise.allможно выполнять несколько асинхронных операций параллельно.
async/await широко используется в TypeScript и JavaScript, так как позволяет проще описывать асинхронные операции.
Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.