Vytváření okamžitě splněných promisů v JavaScriptu

Někdy může být potřeba vytvořit již splněný promis. K tomu existují dvě metody: metoda Promise.resolve vytváří úspěšně splněný promis, Promise.reject vytváří zamítnutý promis. Parametrem tyto metody přijímají to, co se stane výsledkem nebo chybou promisu.

Kdy může být potřeba již splněný promis? Podívejme se na příklad. Předpokládejme, že máme nějakou funkci, která parametrem přijímá číslo, něco s ním asynchronně dělá a vrací promis s výsledkem:

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

Naší funkcí budeme používat následujícím způsobem:

javascriptfunc(5).then(function(res) {
  console.log(res); // vypíše 25
});

Předpokládejme nyní, že jsme se rozhodli, že naši asynchronní operaci provedeme pouze pokud je předáno číslo větší než nula. V opačném případě výsledkem funkce má být nula:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // nulový výsledek
  }
}

Avšak nyní se stane, že funkce vrací buď promis, nebo číslo. Kvůli tomu již nemůžeme aplikovat metodu then na výsledek funkce, protože v případě vrácení číslo funkci dostaneme chybu:

javascriptfunc(0).then(function(res) { // chyba, aplikujeme metodu then na nulu
  
});

Vyřešit problém nám pomůže Promise.resolve:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // vracíme promis, ne číslo
  }
}

Předpokládejme nyní, že jsme se rozhodli, že pro předanou nulu máme vrátit nulu, a pro čísla menší než nula - výjimku. S tím nám pomůže 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'); // vrátíme zamítnutý promis
  }
}