Kuunda Ahadi Zilizokwisha Kutimia kwenye JavaScript
Wakati mwingine huenda ukahitaji kuunda ahadi
iliyokwisha kutimia. Kwa hili kuna njia mbili:
Njia Promise.resolve
huunda ahadi iliyofanikiwa, Promise.reject
huunda ahadi iliyokataliwa. Kama parameta, hizi
nia hupokea kile kitakachokuwa matokeo
au hitilafu ya ahadi mtawalia.
Tunawezaje kuhitaji ahadi iliyokwisha kutimia? Hebu tuangalie kwa mfano. Hebu tuseme tuna baadhi ya kazi, ambayo inapokea nambari kama parameta, inafanya kitu nayo kwa njia isiyo ya synchronic na kurudisha ahadi na matokeo:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Tutatumia kazi yetu kama ifuatavyo:
func(5).then(function(res) {
console.log(res); // itatoa 25
});
Hebu tuseme sasa tumekubiana, kwamba operesheni yetu isiyo ya synchronic tutafanya tu ikiwa nambari iliyopitishwa ni kubwa kuliko sifuri. Vinginevyo matokeo ya kazi yanapaswa kuwa sifuri:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // matokeo ya sifuri
}
}
Hata hivyo, sasa inabadilika kuwa kazi inarudisha
ama ahadi, ama nambari. Kwa sababu hii hatuwezi
tena kutumia mbinu then kwa matokeo
ya kazi, kwa sababu katika tukio la kazi kurudisha
nambari tutapata hitilafu:
func(0).then(function(res) { // hitilafu, tunatumia mbinu then kwa sifuri
});
Kutatua tatizo hili Promise.resolve itatusaidia:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // tunarudisha ahadi, na si nambari
}
}
Hebu tuseme sasa tumekubiana, kwamba kwa nambari iliyopitishwa
sifuri tunapaswa kurudisha sifuri, na kwa nambari
ndogo kuliko sifuri - isipokuwe. Hii itatusaidia
katika mbinu 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'); // turudishe ahadi iliyokataliwa
}
}