Crearea promisiunilor rezolvate în JavaScript

Uneori ai putea avea nevoie să creezi o promisiune deja rezolvată. Pentru aceasta există două metode: metoda Promise.resolve crează o promisiune rezolvată cu succes, Promise.reject crează o promisiune respinsă. Ca parametru, aceste metode primesc ceea ce va deveni rezultatul sau eroarea promisiunii, respectiv.

Când am putea avea nevoie de o promisiune deja rezolvată? Să ne uităm la un exemplu. Să presupunem că avem o funcție care primește un număr ca parametru, face ceva cu el în mod asincron și returnează o promisiune cu rezultatul:

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

Vom folosi funcția noastră în felul următor:

javascriptfunc(5).then(function(res) {
  console.log(res); // va afișa 25
});

Să presupunem acum că am decis că operația noastră asincronă o vom efectua doar dacă este transmis un număr mai mare decât zero. În caz contrar, rezultatul funcției ar trebui să fie zero:

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

Cu toate acestea, acum rezultă că funcția returnează fie o promisiune, fie un număr. Din această cauză, nu mai putem aplica metoda then rezultatului funcției, deoarece în cazul în care funcția returnează un număr, vom obține o eroare:

javascriptfunc(0).then(function(res) { // eroare, aplicăm metoda then la zero
  
});

Metoda Promise.resolve ne va ajuta să remediem problema:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // returnăm o promisiune, nu un număr
  }
}

Să presupunem acum că am decis că pentru zero transmis trebuie să returnăm zero, iar pentru numere mai mici decât zero - o excepție. Metoda Promise.reject ne va ajuta în acest sens:

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'); // returnăm o promisiune respinsă
  }
}