Промисы в JavaScript
Promise
Promise — это функция-конструктор, которая используется для создания промисов в JavaScript. Промис представляет собой объект, который позволяет работать с асинхронными операциями и выполнять их без блокировки основного потока выполнения.
Промис может находиться в одном из следующих состояний:
- Pending (Ожидание) — начальное состояние, когда асинхронная операция еще не завершена.
- Fulfilled (Исполнено) — когда асинхронная операция завершена успешно.
- Rejected (Отклонено) — когда асинхронная операция завершена с ошибкой.
Пример создания промиса
let promise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Операция выполнена успешно!"); // Успешное выполнение
} else {
reject("Произошла ошибка!"); // Ошибка
}
});
Методы промиса
Promise.all
Promise.all() используется для выполнения нескольких промисов параллельно и возвращает новый промис, который выполнится, когда все промисы из массива завершатся успешно. Если хотя бы один промис отклонится, результат будет отклонен с ошибкой того промиса, который отклонился.
Синтаксис Promise.all
Promise.all([promise1, promise2, ...])
.then((results) => { console.log(results); })
.catch((error) => { console.log(error); });
Пример Promise.all
let promise1 = new Promise((resolve) => setTimeout(resolve, 1000, "Первый"));
let promise2 = new Promise((resolve) => setTimeout(resolve, 2000, "Второй"));
Promise.all([promise1, promise2])
.then((results) => {
console.log(results); // ["Первый", "Второй"]
})
.catch((error) => {
console.log(error); // Если один из промисов отклонится, будет выведена ошибка
});
Promise.race
Promise.race() принимает массив промисов и возвращает новый промис, который завершится как только завершится первый из промисов в массиве (независимо от того, был ли он выполнен успешно или с ошибкой).
Синтаксис Promise.race
Promise.race([promise1, promise2, ...])
.then((value) => { console.log(value); })
.catch((error) => { console.log(error); });
Пример Promise.race
let promise1 = new Promise((resolve) => setTimeout(resolve, 1000, "Первый"));
let promise2 = new Promise((resolve) => setTimeout(resolve, 2000, "Второй"));
Promise.race([promise1, promise2])
.then((value) => {
console.log(value); // "Первый", так как он завершился первым
});
Promise.allSettled
Promise.allSettled() выполняет все промисы в массиве и возвращает результат для каждого, независимо от того, были ли они выполнены или отклонены.
Синтаксис Promise.allSettled
Promise.allSettled([promise1, promise2, ...])
.then((results) => { console.log(results); });
Пример Promise.allSettled
let promise1 = Promise.resolve("Первый");
let promise2 = Promise.reject("Ошибка во втором");
Promise.allSettled([promise1, promise2])
.then((results) => {
console.log(results);
// [{ status: "fulfilled", value: "Первый" }, { status: "rejected", reason: "Ошибка во втором" }]
});
Promise.any
Promise.any() возвращает новый промис, который выполнится, как только первый промис из массива завершится успешно. Если все промисы отклоняются, он отклонится с ошибкой.
Синтаксис Promise.any
Promise.any([promise1, promise2, ...])
.then((value) => { console.log(value); })
.catch((error) => { console.log(error); });
Пример Promise.any
let promise1 = new Promise((resolve, reject) => setTimeout(reject, 1000, "Ошибка 1"));
let promise2 = new Promise((resolve) => setTimeout(resolve, 2000, "Успех"));
Promise.any([promise1, promise2])
.then((value) => {
console.log(value); // "Успех", потому что второй промис завершился первым успешно
})
.catch((error) => {
console.log(error); // Если все промисы отклонятся, будет выведена ошибка
});