Ahadi (Promises) Katika Mtindo wa Sawa (Synchronous) katika JavaScript
Kutatua tatizo la ahadi (promise) zilizo ngumu (hell), ulibuniwa sintaksia maalum ya ahadi (promises), inayoruhusu kuandika msimbo usio sawa (asynchronous) kwa urahisi zaidi - kwa mtindo wa sawa (synchronous).
Wacha tuanze kuisoma. Kwanza tuchukue msimbo kutoka somo lilopita:
function func() {
getSmth(2).then(res => {
console.log(res); // itatoa 4
});
}
func();
Ikiwa kitendo chetu getSmth kingekuwa
sawa (synchronous), basi msimbo wa kitendo func tunaweza
kuuandika upya kama ifuatavyo:
function func() {
let res = getSmth(2);
console.log(res); // itatoa 4
}
Kitendo getSmth, hata hivyo, ni kisio sawa (asynchronous),
kwa hivyo msimbo ulio hapo juu haufanyi kazi.
Lakini, kwa kutumia mtindo wa sawa (synchronous) wa ahadi (promises),
tunaweza kupata kitu kama hicho. Wacha tufanye hivi.
Kwanza lazima tutangaze kitendo chetu
func kuwa kisio sawa (asynchronous) kwa kutumia amri maalum
async:
async function func() {
}
Baada ya hapo, tutaweza ndani ya kitendo func
kutumia amri maalum await.
Amri hii, iliyoandikwa kabla ya ahadi (promise), italazimisha
JavaScript kusubiri hadi ahadi (promise)
itakapokamilika. Baada ya hapo amri itarudisha
matokeo ya ahadi (promise), na utekelezaji wa msimbo utaendelea.
Katika kesi yetu, lazima tuandike await
kabla ya kuitwa getSmth. Kwa kuwa matokeo
ya kiitiko cha kitendo hiki kitakuwa ahadi (promise), basi utekelezaji
zaidi wa msimbo utaendelea tu baada ya
ahadi (promise) hii kutekelezwa. Na, matokeo
ya ahadi (promise) yanaweza kuhifadhiwa kwenye kutofautisha (variable). Wacha tufanye
kama ilivyoelezewa:
async function func() {
let res = await getSmth(2);
console.log(res); // itatoa 4
}
func();
Wacha tuite getSmth mara kadhaa:
async function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // itatoa 13
}
func();
Sasa tuite getSmth kwa kutumia kitanzi (loop):
async function func() {
let arr = [1, 2, 3, 4, 5];
let sum = 0;
for (let elem of arr) {
sum += await getSmth(elem);
}
console.log(sum);
}
func();
Andika upya msimbo ufuatao kupitia sintaksia ya sawa (synchronous):
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();