JavaScriptda Ishchi Promise-larni Yaratish
Ba'zan sizga allaqachon bajarilgan promise yaratish kerak bo'lishi mumkin. Buning uchun ikkita usul mavjud:
Promise.resolve usuli muvaffaqiyatli bajarilgan promise yaratadi, Promise.reject usuli esa
rad etilgan promise yaratadi. Ushbu usullar parametr sifatida promise natijasi yoki xatosi bo'ladigan narsani oladi.
Qachon bizga allaqachon bajarilgan promise kerak bo'lishi mumkin? Keling, bir misolni ko'rib chiqaylik. Faraz qilaylik, bizda ma'lum bir funktsiya bor, u parametr sifatida sonni oladi, uni bilan asinxron ravishda ishlaydi va natija bilan promise qaytaradi:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Biz ushbu funktsiyadan quyidagicha foydalanamiz:
func(5).then(function(res) {
console.log(res); // 25 ni chiqaradi
});
Endi faraz qilaylik, biz qaror qildikki, bizning asinxron operatsiyamizni faqat berilgan son noldan katta bo'lsa bajaramiz. Aks holda funktsiya natijasi nol bo'lishi kerak:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nol natija
}
}
Biroq, endi funktsiya yoki promise yoki son qaytarayotganga o'xshaydi.
Buning sababli, biz endi funktsiya natijasiga then metodini qo'llay olmaymiz,
chunki funktsiya son qaytarganda biz xatolik olamiz:
func(0).then(function(res) { // xato, nolga then metodini qo'llayapmiz
});
Bu muammoni Promise.resolve bizga hal qilishga yordam beradi:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // son emas, balki promise qaytaramiz
}
}
Endi faraz qilaylik, biz qaror qildikki, berilgan nol uchun nol qaytarishimiz kerak,
nolga teng bo'lmagan sonlar uchun esa istisno. Bunda Promise.reject usuli bizga yordam beradi:
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('noto‘g‘ri son'); // rad etilgan promiseni qaytaramiz
}
}