Kreiranje ispunjenih promisa u JavaScript-u

Ponekad vam može zatrebati da kreirate već ispunjen promise. Za to postoje dve metode: metoda Promise.resolve kreira uspešno ispunjen promise, Promise.reject kreira odbijeni promise. Kao parametar ove metode primaju ono što će postati rezultat ili greška promise-a respektivno.

Kada nam može zatrebati već ispunjen promise? Pogledajmo na primeru. Neka imamo određenu funkciju koja parametrom prima broj, nešto asinhrono radi s njim i vraća promise sa rezultatom:

javascriptfunction func(num) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(num * num);
    }, 3000);
  });
}

Koristićemo našu funkciju na sledeći način:

javascriptfunc(5).then(function(res) {
  console.log(res); // ispisaće 25
});

Neka smo sada odlučili da ćemo našu asinhronu operaciju izvršavati samo ako je prosledjen broj veći od nule. U suprotnom rezultat funkcije treba da bude nula:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // nulti rezultat
  }
}

Međutim, sada se ispostavlja da funkcija vraća ili promise, ili broj. Zbog toga više ne možemo primeniti metodu then na rezultat funkcije, jer u slučaju da funkcija vrati broj dobićemo grešku:

javascriptfunc(0).then(function(res) { // greška, primenjujemo metodu then na nulu
  
});

Problem ćemo rešiti uz pomoć Promise.resolve:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // vraćamo promise, a ne broj
  }
}

Neka smo sada odlučili da za prosleđenu nulu treba da vratimo nulu, a za brojeve manje od nule - izuzetak. U tome će nam pomoći metoda Promise.reject:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else if (num === 0) {
    return Promise.resolve(0);
  } else {
    return Promise.reject('incorrect number'); // vratićemo odbijeni promise
  }
}