Методы промисов (Promise API)

24-06-24 12:27:34


Image for the Методы промисов (Promise API)

Методы промисов

  1. Promise.resolve()
  2. Promise.reject()
  3. Promise.all()
  4. Promise.race()
  5. Promise.allSettled()
  6. Promise.any()

Каждый из этих методов служит уникальной цели в управлении асинхронным кодом.

Promise.resolve()

Promise.resolve(value) возвращает промис, который разрешается с указанным значением. Это полезно для преобразования значений или объектов в промис.

const resolvedPromise = Promise.resolve(42);

resolvedPromise.then(value => {
console.log(value); // Вывод: 42
});
Promise.reject()

Promise.reject(reason) возвращает промис, который отклоняется с указанной причиной. Это полезно для создания промисов, которые немедленно завершаются с ошибкой.

const rejectedPromise = Promise.reject('Произошла ошибка');

rejectedPromise.catch(error => {
console.log(error); // Вывод: Произошла ошибка
});
Promise.all()

Promise.all(iterable) принимает итерируемый объект промисов и возвращает единый промис, который разрешается, когда все промисы в итерируемом объекте разрешены, или отклоняется, когда любой из промисов отклоняется. Этот метод полезен для выполнения нескольких асинхронных операций параллельно и ожидания их завершения.

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(values => {
console.log(values); // Вывод: [3, 42, "foo"]
});
Promise.race()

Promise.race(iterable) принимает итерируемый объект промисов и возвращает единый промис, который разрешается или отклоняется, как только один из промисов в итерируемом объекте разрешается или отклоняется. Это полезно в сценариях, когда вас интересует первый завершившийся промис.

const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(value => {
console.log(value); // Вывод: "two"
});
Promise.allSettled()

Promise.allSettled(iterable) принимает итерируемый объект промисов и возвращает единый промис, который разрешается после того, как все промисы в итерируемом объекте завершены (разрешены или отклонены). Это полезно, когда вам нужно знать результат всех промисов, независимо от того, разрешены они или отклонены.

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 100, 'error');
});

Promise.allSettled([promise1, promise2]).then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('Разрешено:', result.value);
} else {
console.log('Отклонено:', result.reason);
}
});
});
// Вывод:
// Разрешено: 3
// Отклонено: error
Promise.any()

Promise.any(iterable) принимает итерируемый объект промисов и возвращает единый промис, который разрешается, как только любой из промисов в итерируемом объекте разрешается, с значением разрешенного промиса. Если ни один промис в итерируемом объекте не разрешается, он отклоняется с AggregateError. Этот метод полезен, когда вам нужен первый успешный промис.

const promise1 = new Promise((resolve, reject) => {
setTimeout(reject, 100, 'error');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 200, 'success');
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 300, 'another success');
});

Promise.any([promise1, promise2, promise3]).then(value => {
console.log(value); // Вывод: "success"
}).catch(error => {
console.log(error.errors); // В случае, если все промисы отклонены
});