Skip to content

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:

js
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

js
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

js
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

js
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:

js
let a = await getA() // 2 soniya
let b = await getB() // 2 soniya
// Jami: 4 soniya

Parallel (Parallel) — tezroq:

js
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.