JavaScriptда синхрон услубидаги промислар
Promise hell муаммосини ҳал қилиш учун асинхрон кодни жуда осон - синхрон услубида ёзиш имкони берадиган махсус промис синтаксиси ишлаб чиқилган.
Келгинг, уни ўрганишни бошлайми. Аввало ўтган дарсдаги кодни оламиз:
function func() {
getSmth(2).then(res => {
console.log(res); // 4 ни чиқаради
});
}
func();
Агар бизнинг getSmth функциямиз
синхрон бўлганида, func функциясининг
кодини қуйидагича ёзишимиз мумкин эди:
function func() {
let res = getSmth(2);
console.log(res); // 4 ни чиқаради
}
Аммо, getSmth функцияси асинхрон,
шунинг учун юқорида келтирилган код ишламayди.
Аммо, промисларнинг синхрон услубидан фойдалансак,
biz ўхшаш нарсага эриша оламиз. Буни қилайлик.
Аввало биз func функциямизни махсус
async командаси ёрдамида асинхрон
эълон қилишимиз керак:
async function func() {
}
Шундан сўнг биз func функциясининг
ичида махсус await командасидан
foydalanishimiz мумкин бўлади.
Ушбу команда, промис олдида ёзилганда,
JavaScript промис бажарилгунича кутishга
мажбур қилади. Шундан сўнг команда промиснинг
натижасини қайтаради ва коднинг бажарилиши
давом этади.
Бизнинг ҳолатимизда биз await ни
getSmth чақириги олдида ёзишимиз керак.
Чунки ушбу функцияни чақириш натижаси промис
бўлгани учун, коднинг keyingi бажарилиши
фақатгина ушбу промис бажарилгандан сўнггина
давом этади. Ҳамда, промис натижаси ўзгарувчига
ёзилиши мумкин. Юқорида таърифлаб ўтилганларни
амалга оширамиз:
async function func() {
let res = await getSmth(2);
console.log(res); // 4 ни чиқаради
}
func();
Келгинг, getSmth ни бир неча марта чақирайлик:
async function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // 13 ни чиқаради
}
func();
Энди esa getSmth ни цикл ичида чақирайлик:
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();
Қуйидаги кодни синхрон синтаксис орқали қайта ёзинг:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();