Креирање на исполнети ветувања во JavaScript
Понекогаш може да ви треба да креирате веќе
исполнето ветување. За ова постојат
две методи: методот Promise.resolve
креира успешно исполнето ветување, Promise.reject
креира одбиено ветување. Како параметар овие
методи го примаат она што ќе стане резултат
или грешка на ветувањето соодветно.
Кога може да ни треба веќе исполнето ветување? Ајде да погледнеме на пример. Нека имаме одредена функција која како параметар прима број, нешто асинхроно прави со него и враќа ветување со резултатот:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Ќе ја користиме нашата функција на следниов начин:
func(5).then(function(res) {
console.log(res); // ќе испечати 25
});
Нека сега решиме дека нашата асинхрона операција ќе ја извршуваме само ако е пренесен број поголем од нула. Во спротивен случај резултатот на функцијата треба да биде нула:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // нула како резултат
}
}
Сепак, сега излегува дека функцијата враќа
или ветување или број. Поради ова веќе
не можеме да го примениме методот then на резултатот
од функцијата, бидејќи во случај на враќање на
број од функцијата ќе добиеме грешка:
func(0).then(function(res) { // грешка, применуваме метод then на нула
});
Да го поправиме проблемот со Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // враќаме ветување, а не број
}
}
Нека сега решиме дека за пренесена
нула треба да вратиме нула, а за броеви
помали од нула - исклучок. Во ова ќе ни помогне
методот Promise.reject:
function 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'); // враќаме одбиено ветување
}
}