Иногда вам может понадобится создать уже
выполненный промис. Для этого существуют
два метода: метод 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'); // вернем отклоненный промис
}
}