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();
Задание 1

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();