Урок 18: Async/Await
Async/await — это синтаксический сахар в JavaScript для работы с промисами. Он делает асинхронный код более понятным и легким для чтения. В этом уроке мы рассмотрим основы синтаксиса async/await и приведем примеры использования.
Понимание синтаксиса async/await
Ключевое слово async
используется для объявления асинхронной функции. Асинхронная функция всегда возвращает промис. Ключевое слово await
используется для ожидания выполнения промиса и возврата его результата. await
может использоваться только внутри асинхронной функции.
// Пример асинхронной функции с использованием async/await
async function fetchData() {
let response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
let data = await response.json();
console.log(data);
}
fetchData();
{userId: 1, id: 1, title: "Sample Title", body: "Sample Body"}
В этом примере функция fetchData
является асинхронной. Внутри функции мы используем await
для ожидания выполнения промиса, возвращаемого функцией fetch
. После завершения промиса мы получаем данные и выводим их в консоль.
Примеры использования
Рассмотрим несколько примеров использования async/await для выполнения различных асинхронных задач.
Пример 1: Обработка ошибок с использованием try/catch
Async/await позволяет легко обрабатывать ошибки асинхронных операций с помощью блока try/catch
.
// Пример обработки ошибок с использованием try/catch
async function fetchData() {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
if (!response.ok) {
throw new Error('Network response was not ok');
}
let data = await response.json();
console.log(data);
} catch (error) {
console.error('Fetch error:', error);
}
}
fetchData();
{userId: 1, id: 1, title: "Sample Title", body: "Sample Body"}
В этом примере мы используем блок try/catch
для обработки ошибок, которые могут возникнуть при выполнении асинхронных операций. Если происходит ошибка, она выводится в консоль.
Пример 2: Последовательное выполнение асинхронных операций
Async/await позволяет выполнять асинхронные операции последовательно, что упрощает чтение и понимание кода.
// Пример последовательного выполнения асинхронных операций
async function fetchMultipleData() {
let response1 = await fetch('https://jsonplaceholder.typicode.com/posts/1');
let data1 = await response1.json();
console.log(data1);
let response2 = await fetch('https://jsonplaceholder.typicode.com/posts/2');
let data2 = await response2.json();
console.log(data2);
}
fetchMultipleData();
{userId: 1, id: 1, title: "Sample Title 1", body: "Sample Body 1"}
{userId: 1, id: 2, title: "Sample Title 2", body: "Sample Body 2"}
В этом примере мы последовательно выполняем два асинхронных запроса и выводим их результаты в консоль. Асинхронные операции выполняются последовательно благодаря использованию await
.
Пример 3: Параллельное выполнение асинхронных операций
Для параллельного выполнения асинхронных операций можно использовать Promise.all
вместе с async/await.
// Пример параллельного выполнения асинхронных операций
async function fetchParallelData() {
let [response1, response2] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/posts/1'),
fetch('https://jsonplaceholder.typicode.com/posts/2')
]);
let data1 = await response1.json();
let data2 = await response2.json();
console.log(data1);
console.log(data2);
}
fetchParallelData();
{userId: 1, id: 1, title: "Sample Title 1", body: "Sample Body 1"}
{userId: 1, id: 2, title: "Sample Title 2", body: "Sample Body 2"}
В этом примере мы используем Promise.all
для параллельного выполнения двух асинхронных запросов. Результаты обоих запросов обрабатываются после завершения всех промисов.
Упражнения
Упражнение 1: Асинхронная функция для получения данных
Создайте асинхронную функцию getData
, которая делает запрос к URL https://jsonplaceholder.typicode.com/users/1
и выводит в консоль имя пользователя. Используйте await
для ожидания выполнения запроса и try/catch
для обработки ошибок.
Решение:
// Определение функции getData
async function getData() {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/users/1');
if (!response.ok) {
throw new Error('Network response was not ok');
}
let user = await response.json();
console.log(user.name);
} catch (error) {
console.error('Fetch error:', error);
}
}
getData();
Объяснение: Мы создали функцию getData
, которая делает запрос к указанному URL и выводит имя пользователя. Использовали await
для ожидания выполнения запроса и try/catch
для обработки возможных ошибок.
Упражнение 2: Параллельная загрузка данных
Создайте асинхронную функцию loadMultipleData
, которая параллельно загружает данные с URL https://jsonplaceholder.typicode.com/posts/1
и https://jsonplaceholder.typicode.com/posts/2
, а затем выводит результаты в консоль. Используйте Promise.all
для параллельного выполнения запросов.
Решение:
// Определение функции loadMultipleData
async function loadMultipleData() {
try {
let [response1, response2] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/posts/1'),
fetch('https://jsonplaceholder.typicode.com/posts/2')
]);
let data1 = await response1.json();
let data2 = await response2.json();
console.log(data1);
console.log(data2);
} catch (error) {
console.error('Fetch error:', error);
}
}
loadMultipleData();
{userId: 1, id: 1, title: "Sample Title 1", body: "Sample Body 1"}
{userId: 1, id: 2, title: "Sample Title 2", body: "Sample Body 2"}
Объяснение: Мы создали функцию loadMultipleData
, которая параллельно выполняет два асинхронных запроса с использованием Promise.all
. После завершения всех запросов результаты выводятся в консоль.