Izdarīto promisu izveide JavaScript

Dažreiz jums var būt nepieciešams izveidot jau izpildītu promisu. Šim nolūkam pastāv divas metodes: metode Promise.resolve izveido veiksmīgi izpildītu promisu, Promise.reject izveido noraidītu promisu. Šīs metodes kā parametru saņem to, kas attiecīgi kļūs par promisa rezultātu vai kļūdu.

Kad mums var būt nepieciešams jau izpildīts promiss? Apskatīsim piemēru. Pieņemsim, ka mums ir kāda funkcija, kas kā parametru saņem skaitli, kaut ko ar to dara asinhroni un atgriež promisu ar rezultātu:

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

Mēs izmantosim savu funkciju šādi:

javascriptfunc(5).then(function(res) {
  console.log(res); // izvadīs 25
});

Pieņemsim, ka tagad esam nolēmuši, ka mūsu asinhrono darbību veiksim tikai tad, ja ir nodots skaitlis, kas lielāks par nulli. Pretējā gadījumā funkcijas rezultātam jābūt nullei:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // nulles rezultāts
  }
}

Tomēr tagad iznāk, ka funkcija atgriež vai nu promisu, vai skaitli. Tāpēc mēs vairs nevaram piemērot metodi then funkcijas rezultātam, jo gadījumā, ja funkcija atgriež skaitli, mēs saņemsim kļūdu:

javascriptfunc(0).then(function(res) { // kļūda, piemērojam metodi then nullei
  
});

Atrisināt problēmu mums palīdzēs Promise.resolve:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // atgriežam promisu, nevis skaitli
  }
}

Pieņemsim, ka tagad esam nolēmuši, ka nodotajai nullei mums jāatgriež nulle, bet skaitļiem mazākiem par nulli - izņēmums. Šajā gadījumā mums palīdzēs metode 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'); // atgriezīsim noraidītu promisu
  }
}