Креирање на исполнети ветувања во JavaScript

Понекогаш може да ви треба да креирате веќе исполнето ветување. За ова постојат две методи: методот Promise.resolve креира успешно исполнето ветување, Promise.reject креира одбиено ветување. Како параметар овие методи го примаат она што ќе стане резултат или грешка на ветувањето соодветно.

Кога може да ни треба веќе исполнето ветување? Ајде да погледнеме на пример. Нека имаме одредена функција која како параметар прима број, нешто асинхроно прави со него и враќа ветување со резултатот:

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

Ќе ја користиме нашата функција на следниов начин:

javascriptfunc(5).then(function(res) {
  console.log(res); // ќе испечати 25
});

Нека сега решиме дека нашата асинхрона операција ќе ја извршуваме само ако е пренесен број поголем од нула. Во спротивен случај резултатот на функцијата треба да биде нула:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // нула како резултат
  }
}

Сепак, сега излегува дека функцијата враќа или ветување или број. Поради ова веќе не можеме да го примениме методот then на резултатот од функцијата, бидејќи во случај на враќање на број од функцијата ќе добиеме грешка:

javascriptfunc(0).then(function(res) { // грешка, применуваме метод then на нула
  
});

Да го поправиме проблемот со Promise.resolve:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // враќаме ветување, а не број
  }
}

Нека сега решиме дека за пренесена нула треба да вратиме нула, а за броеви помали од нула - исклучок. Во ова ќе ни помогне методот 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'); // враќаме одбиено ветување
  }
}