JavaScript-da Sinxron Uslubda Promiselar
Promise hell muammosini hal qilish uchun alohida promis sintaksisi ixtiro qilindi, bu asinxron kodni ancha oson - sinxron uslubda yozish imkonini beradi.
Keling, uni o'rganishni boshlaymiz. Boshlash uchun oldingi darsdan kodni olaylik:
function func() {
getSmth(2).then(res => {
console.log(res); // 4 ni chiqaradi
});
}
func();
Agar bizning getSmth funksiyamiz
sinxron bo'lsa, func funksiyasining kodini
quyidagicha qayta yozishimiz mumkin edi:
function func() {
let res = getSmth(2);
console.log(res); // 4 ni chiqaradi
}
getSmth funksiyasi, biroq, asinxron,
shuning uchun yuqoridagi kod ishlamaydi.
Ammo, promiselarning sinxron uslubidan foydalanib,
biz shunga o'xshash narsani olamiz. Buni qilaylik.
Boshlash uchun biz o'zimizning funksiyamizni
func maxsus async buyrug'i yordamida
asinxron deb e'lon qilishimiz kerak:
async function func() {
}
Shundan so'ng, biz func funksiyasi ichida
maxsus await buyrug'idan foydalanishimiz mumkin.
Promise oldiga yozilgan ushbu buyruq JavaScript-ning
promise bajarilgunicha kutishiga sabab bo'ladi.
Shundan so'ng buyruq promisening natijasini qaytaradi,
va kod bajarilishi davom etadi.
Bizning holatda, biz getSmth chaqiruvi oldidan
await yozishimiz kerak. Chunki ushbu funksiyani
chaqirish natijasi promise bo'ladi, shuning uchun kodning
keyingi bajarilishi faqat ushbu promise bajarilgandan
keyin davom etadi. Xo'sh, promisening natijasini
o'zgaruvchiga yozish mumkin. Keling, tavsiflanganlarni bajaramiz:
async function func() {
let res = await getSmth(2);
console.log(res); // 4 ni chiqaradi
}
func();
Keling, getSmth ni bir necha marta chaqiraylik:
async function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // 13 ni chiqaradi
}
func();
Endi getSmth ni tsiklda chaqiramiz:
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();
Quyidagi kodni sinxron sintaksis orqali qayta yozing:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();