Teljesített promise-ok létrehozása JavaScriptben

Időnként szükség lehet egy már teljesített promise létrehozására. Erre két módszer áll rendelkezésre: a Promise.resolve metódus sikeresen teljesített promise-ot hoz létre, a Promise.reject elutasított promise-ot hoz létre. Paraméterként ezek a metódusok azt kapják, ami a promise eredménye vagy hibája lesz.

Mikor lehet szükségünk egy már teljesített promise-ra? Nézzünk egy példát. Tegyük fel, hogy van egy függvényünk, amely paraméterként egy számot vesz át, aszinkron módon csinál valamit vele, és visszaad egy promise-t az eredménnyel:

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

A függvényt a következő módon fogjuk használni:

javascriptfunc(5).then(function(res) {
  console.log(res); // kiírja 25-t
});

Tegyük fel, hogy most úgy döntöttünk, hogy az aszinkron műveletet csak akkor hajtjuk végre, ha a kapott szám nagyobb nullánál. Ellenkező esetben a függvény eredménye nulla legyen:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // nulla eredmény
  }
}

Azonban most az történik, hogy a függvény vagy egy promise-t, vagy egy számot ad vissza. Emiatt már nem alkalmazhatjuk a then metódust a függvény eredményére, mert abban az esetben, ha a függvény számot ad vissza, hibát kapunk:

javascriptfunc(0).then(function(res) { // hiba, a then metódust alkalmazzuk nullára
  
});

A Promise.resolve segít megoldani a problémát:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // promise-t adunk vissza, nem számot
  }
}

Tegyük fel, hogy most úgy döntöttünk, hogy az átadott nullára nullát kell visszaadnunk, a nullánál kisebb számok esetén pedig kivételt dobnunk. Ebben a Promise.reject metódus segít:

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'); // visszaadunk egy elutasított promise-t
  }
}