Назад к вопросам
Junior
123
questionbank

Какие виды Promise ты знаешь?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Основные виды промисов в Node.js:

  • Basic Promise: Представляет собой контейнер для будущих значений или ошибок. Имеет три состояния: pending (ожидание), fulfilled (выполнено успешно), rejected (отклонено с ошибкой). Создается с помощью конструктора new Promise().

    // Создание базового промиса
    const myPromise = new Promise((resolve, reject) => {
      // Асинхронная операция
      setTimeout(() => {
        const success = true;
        if (success) {
          resolve("Операция успешно завершена");
        } else {
          reject("Произошла ошибка");
        }
      }, 1000);
    });
    
  • Promise.resolve(): Создает промис, который немедленно переходит в состояние fulfilled с заданным значением.

    // Создание resolved промиса
    const resolvedPromise = Promise.resolve("Это уже выполненный промис");
    
  • Promise.reject(): Создает промис, который немедленно переходит в состояние rejected с заданной причиной ошибки.

    // Создание rejected промиса
    const rejectedPromise = Promise.reject(new Error("Это отклоненный промис"));
    
  • Promise.all(): Принимает массив промисов и возвращает новый промис. Этот новый промис переходит в состояние fulfilled, когда все промисы в массиве успешно завершены. Значением будут массивы результатов в том же порядке, что и входные промисы. Если любой из промисов в массиве отклоняется, Promise.all() немедленно отклоняется с причиной первого отклоненного промиса.

    // Использование Promise.all()
    const promise1 = Promise.resolve(1);
    const promise2 = Promise.resolve(2);
    const promise3 = new Promise((resolve, reject) => setTimeout(() => resolve(3), 100));
    Promise.all([promise1, promise2, promise3])
      .then((values) => {
        // values будет [1, 2, 3]
      })
      .catch((error) => {
        // Обработка ошибок
      });
    
  • Promise.allSettled(): Принимает массив промисов и возвращает новый промис. Этот новый промис переходит в состояние fulfilled, когда все промисы в массиве либо успешно завершены (fulfilled), либо отклонены (rejected). Значением будет массив объектов, описывающих результат каждого промиса (состояние и значение/причина). В отличие от Promise.all(), немедленно не отклоняется.

    // Использование Promise.allSettled()
    const promiseA = Promise.resolve("успех");
    const promiseB = Promise.reject("ошибка");
    Promise.allSettled([promiseA, promiseB])
      .then((results) => {
        // results будет массивом объектов:
        // [{status: 'fulfilled', value: 'успех'}, {status: 'rejected', reason: 'ошибка'}]
      });
    
  • Promise.race(): Принимает массив промисов и возвращает новый промис. Этот новый промис переходит в состояние fulfilled или rejected с результатом/причиной первого промиса из массива, который либо успешно завершился, либо отклонился.

    // Использование Promise.race()
    const promiseFast = new Promise((resolve, reject) => setTimeout(() => resolve("Я быстрый!"), 50));
    const promiseSlow = new Promise((resolve, reject) => setTimeout(() => resolve("Я медленный..."), 500));
    Promise.race([promiseFast, promiseSlow])
      .then((value) => {
        // value будет "Я быстрый!"
      });
    
  • Promise.any(): Принимает массив промисов и возвращает новый промис. Этот новый промис переходит в состояние fulfilled с значением первого промиса из массива, который успешно завершился. Если все промисы в массиве отклоняются, Promise.any() возвращает ошибку AggregateError, содержащую причины всех отклоненных промисов. Доступен начиная с Node.js 12.

    // Использование Promise.any()
    const promiseFail1 = Promise.reject("Ошибка 1");
    const promiseSuccess = Promise.resolve("Успех!");
    const promiseFail2 = Promise.reject("Ошибка 2");
    Promise.any([promiseFail1, promiseSuccess, promiseFail2])
      .then((value) => {
        // value будет "Успех!"
      })
      .catch((error) => {
        // Обработка AggregateError, если все промисы отклонены
      });