Създаване на изпълнени промисове в 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'); // връщаме отхвърлен промис
}
}