Creazione di Promise risolte in JavaScript

A volte potresti aver bisogno di creare una promise già risolta. Per questo esistono due metodi: il metodo Promise.resolve crea una promise risolta con successo, Promise.reject crea una promise rifiutata. Questi metodi ricevono come parametro ciò che diventerà il risultato o l'errore della promise rispettivamente.

Quando potremmo aver bisogno di una promise già risolta? Diamo un'occhiata a un esempio. Supponiamo di avere una funzione che accetta un numero come parametro, fa qualcosa in modo asincrono e restituisce una promise con il risultato:

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

Utilizzeremo la nostra funzione nel seguente modo:

javascriptfunc(5).then(function(res) {
  console.log(res); // restituirà 25
});

Supponiamo ora di aver deciso che eseguiremo la nostra operazione asincrona solo se viene passato un numero maggiore di zero. In caso contrario il risultato della funzione dovrebbe essere zero:

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

Tuttavia, ora risulta che la funzione restituisce o una promise o un numero. A causa di ciò non possiamo più applicare il metodo then al risultato della funzione, poiché nel caso in cui la funzione restituisca un numero otterremo un errore:

javascriptfunc(0).then(function(res) { // errore, applichiamo il metodo then a zero
  
});

Il metodo Promise.resolve ci aiuterà a risolvere il problema:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // restituiamo una promise, non un numero
  }
}

Supponiamo ora di aver deciso che per lo zero passato dobbiamo restituire zero, mentre per i numeri minori di zero - un'eccezione. In questo il metodo Promise.reject ci aiuterà:

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'); // restituiamo una promise rifiutata
  }
}