Sobes.tech
Junior

Какви видове Promise познаваш?

sobes.tech AI

Отговор от AI

Основни видове promises в Node.js:

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

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

    // Създаване на resolved promise
    const resolvedPromise = Promise.resolve("Това вече е изпълнено обещание");
    
  • Promise.reject(): Създава promise, който незабавно преминава в състояние rejected с причина за грешка.

    // Създаване на rejected promise
    const rejectedPromise = Promise.reject(new Error("Това е отхвърлено обещание"));
    
  • Promise.all(): Приема масив от promises и връща нов promise. Този нов promise преминава в състояние fulfilled, когато всички promises в масива успешно завършат. Стойността ще бъде масив от резултати в същия ред като входните promises. Ако някой от promises бъде отхвърлен, Promise.all() се отхвърля незабавно с причината на първия отхвърлен promise.

    // Използване на 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(): Приема масив от promises и връща нов promise. Този нов promise преминава в състояние fulfilled, когато всички promises бъдат успешно завършени или отхвърлени. Стойността ще бъде масив от обекти, които описват резултата на всяко promise (състояние и стойност/причина). За разлика от 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(): Приема масив от promises и връща нов promise. Този нов promise преминава в състояние fulfilled или rejected с резултата/причината на първия promise, който успешно завърши или беше отхвърлен.

    // Използване на 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(): Приема масив от promises и връща нов promise. Този нов promise преминава в състояние fulfilled с стойността на първия promise, който успешно завърши. Ако всички promises бъдат отхвърлени, Promise.any() връща грешка AggregateError, която съдържа причините за всички отхвърлени promises. Достъпно от 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, ако всички promises бъдат отхвърлени
      });