JavaScriptда синхрон услубидаги промислар

Promise hell муаммосини ҳал қилиш учун асинхрон кодни жуда осон - синхрон услубида ёзиш имкони берадиган махсус промис синтаксиси ишлаб чиқилган.

Келгинг, уни ўрганишни бошлайми. Аввало ўтган дарсдаги кодни оламиз:

javascriptfunction func() {
  getSmth(2).then(res => {
    console.log(res); // 4 ни чиқаради
  });
}

func();

Агар бизнинг getSmth функциямиз синхрон бўлганида, func функциясининг кодини қуйидагича ёзишимиз мумкин эди:

javascriptfunction func() {
  let res = getSmth(2);
  console.log(res); // 4 ни чиқаради
}

Аммо, getSmth функцияси асинхрон, шунинг учун юқорида келтирилган код ишламayди. Аммо, промисларнинг синхрон услубидан фойдалансак, biz ўхшаш нарсага эриша оламиз. Буни қилайлик.

Аввало биз func функциямизни махсус async командаси ёрдамида асинхрон эълон қилишимиз керак:

javascriptasync function func() {
  
}

Шундан сўнг биз func функциясининг ичида махсус await командасидан foydalanishimiz мумкин бўлади. Ушбу команда, промис олдида ёзилганда, JavaScript промис бажарилгунича кутishга мажбур қилади. Шундан сўнг команда промиснинг натижасини қайтаради ва коднинг бажарилиши давом этади.

Бизнинг ҳолатимизда биз await ни getSmth чақириги олдида ёзишимиз керак. Чунки ушбу функцияни чақириш натижаси промис бўлгани учун, коднинг keyingi бажарилиши фақатгина ушбу промис бажарилгандан сўнггина давом этади. Ҳамда, промис натижаси ўзгарувчига ёзилиши мумкин. Юқорида таърифлаб ўтилганларни амалга оширамиз:

javascriptasync function func() {
  let res = await getSmth(2);
  console.log(res); // 4 ни чиқаради
}

func();

Келгинг, getSmth ни бир неча марта чақирайлик:

javascriptasync function func() {
  let res1 = await getSmth(2);
  let res2 = await getSmth(3);
  
  console.log(res1 + res2); // 13 ни чиқаради
}

func();

Энди esa getSmth ни цикл ичида чақирайлик:

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

Қуйидаги кодни синхрон синтаксис орқали қайта ёзинг:

javascriptfunction func() {
  getSmth(2).then(res1 => {
    getSmth(3).then(res2 => {
      getSmth(4).then(res3 => {
        console.log(res1 + res2 + res3);
      });
    });
  });
}

func();