# Создание сработавших промисов в 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'); // вернем отклоненный промис } }`
← →
↑
en ru