Async / Await sintaksisi


ULASHISH

Async/Await dasturiga kirish

Async/await - bu Node.js-da asinxron operatsiyalarni boshqarishning zamonaviy usuli bo‘lib, yanada o‘qilishi mumkin bo‘lgan kod yaratish uchun Promiselar ustiga qurilgan.

Node.js 7.6 da taqdim etilgan va ES2017 da standartlashtirilgan async/await sizga ko‘proq sinxron kodga o‘xshab ko‘rinadigan va o‘zini tutadigan asinxron kod yozish imkonini beradi.

Async/await asosan o‘qilishi mumkin bo‘lgan sintaksisga ega va’dalardir. Bu sizning kodingizni toza va barqaror qiladi.

async/await asinxron kodni ko‘rinishga olib keladi va ko‘proq sinxron kod kabi his qiladi. U asosiy oqimni bloklamaydi, lekin uni kuzatish va tushunish oson.


Sintaksis va foydalanish

Sintaksis ikkita kalit so‘zdan iborat:

  • async : Promise-ni qaytaradigan asinxron funksiyani e’lon qilish uchun foydalaniladi
  • await : Promise hal qilinmaguncha bajarishni to‘xtatib turish uchun foydalaniladi, faqat asinxronizatsiya funksiyalarida foydalanish mumkin

Misol: Asosiy Async/Await

async function getData() {
  console.log('Starting...');
  const result = await someAsyncOperation();
  console.log(`Result: ${result}`);
  return result;
}

function someAsyncOperation() {
  return new Promise(resolve => {
    setTimeout(() => resolve('Operation completed'), 1000);
  });
}

// Call the async function
getData().then(data => console.log('Final data:', data));
Misolni ishga tushirish »

Misol: async/await bilan faylni o‘qish

const fs = require('fs').promises;

async function readFile() {
  try {
    const data = await fs.readFile('myfile.txt', 'utf8');
    console.log(data);
  } catch (error) {
    console.error('Error reading file:', error);
  }
}

readFile();
Misolni ishga tushirish »


Try/Catch bilan ishlashda xatolik

Async/await ning afzalliklaridan biri shundaki, siz xatolarni qayta ishlash uchun an’anaviy try/catch bloklaridan foydalanishingiz mumkin, bu esa kodingizni o‘qilishi mumkin bo‘ladi.

Misol: Async/Await bilan ishlashda xatolik

async function fetchUserData() {
  try {
    const response = await fetch('https://api.example.com/users/1');
    if (!response.ok) {
      throw new Error(`HTTP error: ${response.status}`);
    }
    const user = await response.json();
    console.log('User data:', user);
    return user;
  } catch (error) {
    console.error('Error fetching user data:', error);
    throw error; // Re-throw the error if needed
  }
}

Shuningdek, turli stsenariylar uchun async/await ni Promise .catch() bilan aralashtirishingiz mumkin:

// Using catch with an async function
fetchUserData().catch(error => {
  console.log('Caught outside of async function:', error.message);
});
Misolni ishga tushirish »

Parallel Promiselarni bajarish

Garchi async/await kodni sinxron ko‘rinishga olib kelsa-da, ba’zida yaxshi ishlash uchun operatsiyalarni parallel ravishda bajarishingiz kerak bo‘ladi.

Misol: ketma-ket va parallel operatsiyalar

// Helper function to simulate an API call
function fetchData(id) {
  return new Promise(resolve => {
    setTimeout(() => resolve(`Data for ID ${id}`), 1000);
  });
}

// Sequential operation - takes ~3 seconds
async function fetchSequential() {
  console.time('sequential');
  const data1 = await fetchData(1);
  const data2 = await fetchData(2);
  const data3 = await fetchData(3);
  console.timeEnd('sequential');
  return [data1, data2, data3];
}

// Parallel operation - takes ~1 second
async function fetchParallel() {
  console.time('parallel');
  const results = await Promise.all([
    fetchData(1),
    fetchData(2),
    fetchData(3)
  ]);
  console.timeEnd('parallel');
  return results;
}

// Demo
async function runDemo() {
  console.log('Running sequentially...');
  const seqResults = await fetchSequential();
  console.log(seqResults);
  
  console.log('\nRunning in parallel...');
  const parResults = await fetchParallel();
  console.log(parResults);
}

runDemo();
Misolni ishga tushirish »

Async/Await vs Promises vs Backbacks

Keling, bir xil vazifa turli xil asinxron naqshlar bilan qanday bajarilishini ko‘rib chiqaylik:

Callback-lar bilan

function getUser(userId, callback) {
  setTimeout(() => {
    callback(null, { id: userId, name: 'John' });
  }, 1000);
}

function getUserPosts(user, callback) {
  setTimeout(() => {
    callback(null, ['Post 1', 'Post 2']);
  }, 1000);
}

// Using callbacks
getUser(1, (error, user) => {
  if (error) {
    console.error(error);
    return;
  }
  console.log('User:', user);
  
  getUserPosts(user, (error, posts) => {
    if (error) {
      console.error(error);
      return;
    }
    console.log('Posts:', posts);
  });
});
O‘zingiz sinab ko‘ring »

Promiselar bilan

function getUserPromise(userId) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({ id: userId, name: 'John' });
    }, 1000);
  });
}

function getUserPostsPromise(user) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(['Post 1', 'Post 2']);
    }, 1000);
  });
}

// Using promises
getUserPromise(1)
  .then(user => {
    console.log('User:', user);
    return getUserPostsPromise(user);
  })
  .then(posts => {
    console.log('Posts:', posts);
  })
  .catch(error => {
    console.error(error);
  });
O‘zingiz sinab ko‘ring »

Async/Await bilan

// Using async/await
async function getUserAndPosts() {
  try {
    const user = await getUserPromise(1);
    console.log('User:', user);
    
    const posts = await getUserPostsPromise(user);
    console.log('Posts:', posts);
  } catch (error) {
    console.error(error);
  }
}

getUserAndPosts();
O‘zingiz sinab ko‘ring »
Naqsh Pros Kamchiliklari
Callback-lar - Tushunish oson
- Keng qo‘llab-quvvatlanadi
- Callback hell
- Xatolarni qayta ishlash murakkab
- Bu haqda mulohaza yuritish qiyin
Promiselar - .then() bilan zanjir hosil qilish
- Xatolarni yaxshiroq qayta ishlash
- Birlashtirish qulay
- Hali ham murakkab streamlar uchun joylashtirishni talab qiladi
- Async/await kabi o‘qish mumkin emas
Async/Kuting - Toza, sinxronga o‘xshash kod
- Urinish/catch yordamida xatoliklarni oson hal qilish
- Nosozliklarni tuzatish osonroq
- Promiselarni tushunishni talab qiladi
- Ijroni tasodifan blokirovka qilish oson

Eng yaxshi amaliyotlar

Node.js da async/await bilan ishlashda quyidagi eng yaxshi amaliyotlarga amal qiling:

  1. Remember that async functions always return Promises
    async function myFunction() {
      return 'Hello';
    }

    // This returns a Promise that resolves to 'Hello', not the string 'Hello' directly
    const result = myFunction();
    console.log(result); // Promise { 'Hello' }

    // You need to await it or use .then()
    myFunction().then(message => console.log(message)); // Hello
  2. Use Promise.all for concurrent operations

    Agar operatsiyalar parallel ravishda bajarilsa, unumdorlikni oshirish uchun Promise.all dan foydalaning.

  3. Always handle errors

    Sinash/catch bloklaridan foydalaning yoki asinxron funksiya chaqiruviga .catch() zanjirlang.

  4. Avoid mixing async/await with callbacks

    Callback-ga asoslangan funksiyalarni util.promisify yoki maxsus o‘ramlardan foydalanib Promisesga aylantiring.

    const util = require('util');
    const fs = require('fs');

    // Convert callback-based function to Promise-based
    const readFile = util.promisify(fs.readFile);

    async function readFileContents() {
      const data = await readFile('file.txt', 'utf8');
      return data;
    }
  5. Create clean async functions

    Sinxronlashtirilgan funksiyalarni bitta mas’uliyatga yo‘naltiring.

Eng yaxshi amaliyot: Node.js 14.8.0 va undan yuqori versiyalarida ECMAScript modullarida (ESM) mavjud bo‘lgan “yuqori darajadagi kutish” funksiyasidan xabardor bo‘ling, bu modul darajasida asinxronizatsiya funksiyalaridan tashqari kutishdan foydalanish imkonini beradi.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!