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:
javascriptfunction 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:
javascriptfunction 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:
javascriptasync 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:
javascriptasync function func() {
let res = await getSmth(2);
console.log(res); // itatoa 4
}
func();
Wacha tuite getSmth mara kadhaa:
javascriptasync 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):
javascriptasync 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):
javascriptfunction func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();