Стварэнне спрацаваных промісаў у 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'); // вернем адхілены проміс
}
}