Асинхронность/ожидание (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-канал.