Креирање већ извршених промиса у 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'); // вратићемо одбијен промис
}
}