JavaScript-da async va await
async va await kalit so'zlari promislar bilan ishlashni yanada osonlashtiradi. Ular asinxron kodni xuddi sinxron (ketma-ket) yozilgan kod kabi o'qishga va tushunishga imkon beradi.
Asosiy maqsad
- async funksiyani har doim Promise qaytaradigan qiladi.
- await funksiyani Promise natijasi chiqquncha kutishga majbur qiladi.
Nima uchun async/await kerak?
Promise zanjirlari (.then().then()) ham ba'zida uzun va tushunarsiz bo'lib ketishi mumkin. async/await ushbu muammoni hal qiladi va kodni yanada "tekis" (flat) ko'rinishga keltiradi.
Oddiy misol:
async function run() {
let v1 = await step1()
let v2 = await step2(v1)
let v3 = await step3(v2)
console.log(v3)
}
run()"async" kalit so'zi
Funksiya oldiga async qo'yilsa, u har doim Promise qaytaradi. Agar funksiya ichida oddiy qiymat qaytarsangiz ham, JavaScript uni avtomatik ravishda Promise.resolve() qilib beradi.
Misol
async function myFunction() {
return 'Salom'
}
// Chaqirish:
myFunction().then((value) => console.log(value))"await" kalit so'zi
await faqat async funksiya ichida ishlaydi. U shunday deydi: "Mana shu Promise hal bo'lguncha (resolved) kutib tur, keyin esa qiymatni o'zgaruvchiga saqlab ishlashni davom ettir".
Misol
async function loadData() {
let response = await fetch('data.json')
let data = await response.json()
console.log(data)
}Xatolarni boshqarish: try...catch
Promislarda biz .catch() metodidan foydalangan edik. async/await bilan ishlaganda an'anaviy try...catch blokidan foydalanish qulayroq.
Misol
async function loadData() {
try {
let response = await fetch('invalid-url')
let data = await response.json()
console.log(data)
} catch (error) {
console.error('Xatolik yuz berdi: ', error)
}
}Ketma-ketlik vs Parallelizm
Ba'zan bir nechta amallar bir-biriga bog'liq bo'lmaydi. Ularni navbatma-navbat kutish vaqtni yo'qotadi.
Ketma-ket (Sequence) — sekinroq:
let a = await getA() // 2 soniya
let b = await getB() // 2 soniya
// Jami: 4 soniyaParallel (Parallel) — tezroq:
let p1 = getA()
let p2 = getB()
let [a, b] = await Promise.all([p1, p2])
// Jami: 2 soniya (ikkalasi birdaniga boshlanadi)Muhim eslatma
await kalit so'zini asinxron funksiyadan tashqarida ishlatish xatoga olib keladi (Top-level await esa modul tizimlarida ishlaydi). Har doim xatolar ehtimolini try...catch bilan yoping.
