Найти в Дзене

Асинхроность в Js

Давайте разберем асинхронный подход в JavaScript и его преимущества, с описанием методов, обработки ошибок и синтаксиса. Асинхронный подход позволяет работать с операциями, которые занимают неопределенное время (например, запросы к серверу), не блокируя выполнение остального кода. Основные элементы асинхронного программирования включают Promise, async/await, и методы обработки промисов. Асинхронный подход позволяет: Промисы (Promises) в JavaScript позволяют управлять результатом асинхронных операций. Когда операция завершена, Promise возвращает одно из состояний: fulfilled (успешно выполнена), rejected (ошибка) или pending (в ожидании). fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) resolve("Data fetched");
else reject("Error fetching data");
}, 1000);
});
};
fetchData()
.then(result => console.log(result)) // "Data fetched" .catch(error => console.error(error)) // Если ошибк
Оглавление

Давайте разберем асинхронный подход в JavaScript и его преимущества, с описанием методов, обработки ошибок и синтаксиса. Асинхронный подход позволяет работать с операциями, которые занимают неопределенное время (например, запросы к серверу), не блокируя выполнение остального кода. Основные элементы асинхронного программирования включают Promise, async/await, и методы обработки промисов.

Асинхронный подход и его преимущества

Асинхронный подход позволяет:

  1. Улучшить производительность: задачи, такие как сетевые запросы или работа с файлами, могут выполняться параллельно с остальным кодом.
  2. Обеспечить отзывчивость: не нужно ждать завершения длительных операций, что делает приложения более отзывчивыми.
  3. Обрабатывать операции, зависящие от времени выполнения: вы можете обрабатывать данные, когда они поступают, и продолжать выполнять другие задачи.

Промисы: then, catch, finally

Промисы (Promises) в JavaScript позволяют управлять результатом асинхронных операций. Когда операция завершена, Promise возвращает одно из состояний: fulfilled (успешно выполнена), rejected (ошибка) или pending (в ожидании).

  • then: Выполняет функцию, когда промис успешно завершен.
  • catch: Обрабатывает ошибки, если промис завершился с ошибкой.
  • finally: Выполняется в любом случае — независимо от того, завершился промис успехом или ошибкой.

Пример

fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) resolve("Data fetched");
else reject("Error fetching data");
}, 1000);
});
};

fetchData()
.then(result => console.log(result)) // "Data fetched" .catch(error => console.error(error)) // Если ошибка .finally(() => console.log("Operation complete"));

Статичные методы: all, allSettled, race, any, resolve, reject

Эти методы управляют несколькими промисами одновременно и дают разные возможности обработки:

  • Promise.all(promises): Ожидает завершения всех промисов и возвращает массив их результатов. Если один из промисов завершится ошибкой, all вернет ошибку.

Promise.all([fetchData1(), fetchData2()])
.then(results => console.log(results))
.catch(error => console.error(error));
  • Promise.allSettled(promises): Ожидает завершения всех промисов и возвращает массив их статусов и результатов, независимо от успешности.

Promise.allSettled([fetchData1(), fetchData2()])
.then(results => console.log(results));

Promise.race(promises): Возвращает результат первого завершившегося промиса, успешного или с ошибкой.


Promise.race([fetchData1(), fetchData2()])
.then(result => console.log(result))
.catch(error => console.error(error));

  • Promise.any(promises): Ожидает первый успешный промис. Если все промисы завершились ошибками, возвращает ошибку
    Promise.any([fetchData1(), fetchData2()])
    .then(result => console.log(result))
    .catch(error => console.error("All promises failed"));
  • Promise.resolve(value): Возвращает успешно завершившийся промис с указанным значением.
    javascriptКопировать кодPromise.resolve("Resolved value")
    .then(result => console.log(result));
  • Promise.reject(error): Возвращает промис, завершившийся с ошибкой.
    javascriptКопировать кодPromise.reject("Error occurred")
    .catch(error => console.error(error));

Async/Await

async/await — это синтаксическая надстройка над промисами, которая делает код более линейным и читаемым.

  • Async функция: Функция, перед которой написано async, всегда возвращает промис.
  • Await: Приостанавливает выполнение функции до завершения промиса. await можно использовать только внутри async функции.

Пример

javascriptКопировать кодasync function fetchData() {
try {
const data = await fetch("https://api.example.com/data");
const json = await data.json();
console.log(json);
} catch (error) {
console.error("Error fetching data:", error);
} finally {
console.log("Fetch operation complete");
}
}

fetchData();

Обработка ошибок

Обработка ошибок в async/await осуществляется через try...catch. При ошибке в любом await внутри try, управление передается в catch:

javascriptКопировать кодasync function fetchData() {
try {
const response = await fetch("https://api.example.com/data");
if (!response.ok) throw new Error("Network response was not ok");
const data = await response.json();
console.log(data);
} catch (error) {
console.error("Fetch failed:", error);
}
}

Возвращаемое значение асинхронной функции

Асинхронная функция всегда возвращает Promise. Например, если функция async function fetchData() возвращает результат data, то вызов fetchData() вернет Promise, который можно обработать через then или await.

javascriptКопировать кодasync function getData() {
return "Data retrieved";
}

getData().then(console.log); // "Data retrieved"

Вывод

Асинхронное программирование в JavaScript дает возможность обрабатывать задачи, требующие времени, не блокируя основной поток кода. Это особенно полезно для сетевых запросов и операций с файлами.