JavaScriptда ишлашган промислар яратиш
Баъзан сизга аллакачон бажарилган промис
яратиш керак бўлиши мумкин. Бунинг учун икки
усул мавжуд: Promise.resolve усули
mуваффақиятли бажарилган промис яратади, 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'); // рад этилган промисни қайтарамиз
}
}