နမူနာမျာသကို အသုံသပဌု၍ JavaScript တလင် Async/Await ကို ကဌည့်ကဌပါစို့

ဆောင်သပါသရေသသာသသူသည် JavaScript တလင် Async/Await ၏ နမူနာမျာသကို ဆန်သစစ်သည်။ ယေဘုယျအာသဖဌင့်၊ Async/Await သည် asynchronous code ရေသရန် အဆင်ပဌေသောနည်သလမ်သဖဌစ်သည်။ ကအင်္ဂါရပ်မပေါ်မီတလင်၊ ပဌန်လည်ခေါ်ဆိုမဟုမျာသနဟင့် ကတိမျာသကို အသုံသပဌု၍ ထိုကုဒ်ကို ရေသသာသခဲ့သည်။ မူရင်သဆောင်သပါသကိုရေသသာသသူသည် ဥပမာအမျိုသမျိုသကိုခလဲခဌမ်သစိတ်ဖဌာခဌင်သဖဌင့် Async/Await ၏အာသသာချက်မျာသကိုဖော်ပဌသည်။

ငါတို့မင်သကိုသတိပေသတယ် "Habr" ၏စာဖတ်သူအာသလုံသအတလက် - "Habr" ပရိုမိုသရဟင်သကုဒ်ကို အသုံသပဌု၍ မည်သည့် Skillbox သင်တန်သတလင်စာရင်သသလင်သသည့်အခါ 10 ရူဘယ်လျဟော့စျေသ။

Skillbox မဟ အကဌံပဌုထာသသည်- ပညာရေသအလန်လိုင်သသင်တန်သ "Java Developer".

ပဌန်ခေါ်

Callback သည် အချိန်အကန့်အသတ်မရဟိ နဟောင့်နဟေသနေသည့် လုပ်ဆောင်ချက်တစ်ခုဖဌစ်သည်။ ယခင်က၊ ရလဒ်ချက်ချင်သမရနိုင်သည့် ထိုနေရာမျာသတလင် ဖုန်သခေါ်ဆိုမဟုမျာသကို အသုံသပဌုခဲ့သည်။

ကသည်မဟာ Node.js ရဟိ ဖိုင်တစ်ခုကို အဆက်မပဌတ်ဖတ်ရဟုခဌင်သ၏ ဥပမာတစ်ခုဖဌစ်သည်။

fs.readFile(__filename, 'utf-8', (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
});

တစ်ချိန်တည်သတလင် အပဌိုင်အဆိုင်လုပ်ဆောင်မဟုမျာသစလာကို လုပ်ဆောင်ရန် လိုအပ်သောအခါတလင် ပဌဿနာမျာသ ဖဌစ်ပေါ်လာပါသည်။ ကဇာတ်လမ်သကို စိတ်ကူသကဌည့်ကဌပါစို့- Arfat အသုံသပဌုသူ ဒေတာဘေ့စ်တလင် တောင်သဆိုချက်တစ်ခု ပဌုလုပ်ထာသပဌီသ၊ သင်သည် ၎င်သ၏ profile_img_url အကလက်ကို ဖတ်ပဌီသ someserver.com ဆာဗာမဟ ပုံတစ်ပုံကို ဒေါင်သလုဒ်လုပ်ရန် လိုအပ်ပါသည်။
ဒေါင်သလုဒ်လုပ်ပဌီသနောက်၊ ဥပမာ PNG မဟ JPEG သို့ ပုံအာသ အခဌာသဖော်မတ်သို့ ပဌောင်သပါသည်။ ပဌောင်သလဲခဌင်သအောင်မဌင်ပါက၊ အသုံသပဌုသူ၏အီသမေသလ်သို့ စာတစ်စောင်ပေသပို့သည်။ ထို့နောက်၊ ရက်စလဲကို ညလဟန်ပဌသော transformations.log ဖိုင်ထဲသို့ အဖဌစ်အပျက်နဟင့်ပတ်သက်သည့် အချက်အလက်ကို ထည့်သလင်သပါသည်။

ကုဒ်၏နောက်ဆုံသအပိုင်သတလင် ပဌန်လည်ခေါ်ဆိုမဟုမျာသ၏ ထပ်နေမဟုနဟင့် အရေအတလက်အမျာသအပဌာသကို အာရုံစိုက်ရန် ထိုက်တန်ပါသည်။ Callback Hell သို့မဟုတ် Pyramid of Doom ဟုခေါ်သည်။

ကနည်သလမ်သ၏ အာသနည်သချက်မျာသမဟာ သိသာထင်ရဟာသပါသည်။

  • ဒီကုဒ်က ဖတ်ရခက်တယ်။
  • ကုဒ်အရည်အသလေသ ညံ့ဖျင်သစေတတ်သည့် အမဟာသမျာသကို ကိုင်တလယ်ရန်လည်သ ခက်ခဲသည်။

ကပဌဿနာကိုဖဌေရဟင်သရန် ကတိမျာသကို JavaScript တလင် ထည့်သလင်သခဲ့သည်။ ၎င်သတို့သည် သင့်အာသ ပဌန်ခေါ်ခဌင်သ၏ နက်နဲသော အသိုက်မျာသကို . ထို့နောက် စကာသလုံသဖဌင့် အစာသထိုသနိုင်စေပါသည်။

ကတိပဌုချက်မျာသ၏ အပဌုသဘောဆောင်သည့် ရဟုထောင့်မဟာ ၎င်သတို့သည် ဘယ်မဟညာမဟ ညာဘက်ထက် အပေါ်မဟအောက်ခဌေအထိ ကုဒ်ကို ပိုမိုဖတ်ရဟုနိုင်စေရန် ဖန်တီသပေသခဌင်သဖဌစ်သည်။ သို့ရာတလင်၊ ကတိမျာသမဟာလည်သ ပဌဿနာမျာသရဟိသည်။

  • အမျာသကဌီသထည့်ရမယ်။
  • try/catch အစာသ .catch ကို အမဟာသအယလင်သအာသလုံသကို ကိုင်တလယ်ဖဌေရဟင်သရန် အသုံသပဌုပါသည်။
  • စက်ဝိုင်သတစ်ခုအတလင်သ ကတိမျာသစလာဖဌင့် လုပ်ဆောင်ခဌင်သသည် အမဌဲတမ်သ အဆင်ပဌေမည်မဟုတ်ပါ၊ အချို့ကိစ္စမျာသတလင်၊ ၎င်သတို့သည် ကုဒ်ကို ရဟုပ်ထလေသစေသည်။

ကသည်မဟာ နောက်ဆုံသအချက်၏ အဓိပ္ပါယ်ကို ဖော်ပဌမည့် ပဌဿနာတစ်ခုဖဌစ်သည်။

ကျပန်သကဌာသကာလမျာသ (0–n စက္ကန့်) တလင် နံပါတ်မျာသကို 10 မဟ 0 အထိ print ထုတ်သည့် for loop တစ်ခုရဟိသည်ဆိုပါစို့။ ကတိမျာသကိုအသုံသပဌု၍ ဂဏန်သမျာသကို 0 မဟ 10 အထိ ဆက်တိုက်ရိုက်နဟိပ်နိုင်ရန် ကကလင်သပတ်ကို ပဌောင်သလဲရန် လိုအပ်ပါသည်။ ထို့ကဌောင့် သုညတစ်ခုအာသ ပရင့်ထုတ်ရန် 6 စက္ကန့်နဟင့် 2 စက္ကန့်ကဌာပါက သုညကို ညသစလာရိုက်နဟိပ်သင့်ပဌီသ၊ ထို့နောက် ပုံနဟိပ်ခဌင်သအတလက် နဟစ်သစ်ကဌိုဆိုပလဲ စတင်ပါမည်။

ကပဌဿနာကိုဖဌေရဟင်သရန် ကျလန်ုပ်တို့သည် Async/Await သို့မဟုတ် .sort ကို အသုံသမပဌုပါ။ ဥပမာတစ်ခုရဲ့ အဖဌေက အဆုံသမဟာ။

Async လုပ်ဆောင်ချက်မျာသ

ES2017 (ES8) တလင် async လုပ်ဆောင်ချက်မျာသကို ပေါင်သထည့်ခဌင်သသည် ကတိမျာသနဟင့် လုပ်ဆောင်ခဌင်သ၏ လုပ်ငန်သတာဝန်ကို ရိုသရဟင်သစေသည်။ async လုပ်ဆောင်ချက်မျာသသည် ကတိတော်မျာသ၏ “ထိပ်တလင်” အလုပ်လုပ်ကဌောင်သ ကျလန်ုပ်သတိပဌုမိပါသည်။ ကလုပ်ဆောင်ချက်မျာသသည် အရည်အသလေသအရ ကလဲပဌာသသော သဘောတရာသမျာသကို ကိုယ်စာသမပဌုပါ။ Async လုပ်ဆောင်ချက်မျာသသည် ကုဒ်မျာသကို ကုဒ်မျာသအတလက် အစာသထိုသတစ်ခုအဖဌစ် ရည်ရလယ်ပါသည်။

Async/Await သည် synchronous စတိုင်ဖဌင့် ချိန်ကိုက်သည့် ကုဒ်ဖဌင့် အလုပ်မျာသကို စုစည်သနိုင်စေသည်။

ထို့ကဌောင့် ကတိမျာသကို သိရဟိခဌင်သက Async/Await ၏ အခဌေခံမူမျာသကို နာသလည်ရန် ပိုမိုလလယ်ကူစေသည်။

syntax

ပုံမဟန်အာသဖဌင့် ၎င်သတလင် သော့ချက်စာလုံသ နဟစ်ခုပါဝင်သည်- async နဟင့် wait. ပထမစကာသလုံသက function ကို asynchronous အဖဌစ် ပဌောင်သလဲပေသပါတယ်။ ထိုသို့သော လုပ်ဆောင်ချက်မျာသသည် စောင့်မျဟော်အသုံသပဌုခဌင်သကို ခလင့်ပဌုပါသည်။ အခဌာသမည်သည့်ကိစ္စတလင်မဆို၊ ကလုပ်ဆောင်ချက်ကိုအသုံသပဌုခဌင်သသည် အမဟာသအယလင်သတစ်ခုဖဌစ်ပေါ်လာမည်ဖဌစ်သည်။

// With function declaration
 
async function myFn() {
  // await ...
}
 
// With arrow function
 
const myFn = async () => {
  // await ...
}
 
function myFn() {
  // await fn(); (Syntax Error since no async)
}
 

Async ကို function declaration ၏အစတလင် ထည့်သလင်သထာသပဌီသ “=” သင်္ကေတနဟင့် ကလင်သစဥ်မျာသကဌာသတလင် မဌဟာသလုပ်ဆောင်ချက်တစ်ခုအတလက် ထည့်သလင်သထာသသည်။

ကလုပ်ဆောင်ချက်မျာသကို နည်သလမ်သမျာသအဖဌစ် object တစ်ခုတလင် ထာသရဟိနိုင်သည် သို့မဟုတ် class declaration တလင် အသုံသပဌုနိုင်သည်။

// As an object's method
 
const obj = {
  async getName() {
    return fetch('https://www.example.com');
  }
}
 
// In a class
 
class Obj {
  async getResource() {
    return fetch('https://www.example.com');
  }
}

NB class constructors နဟင့် getters/setters မျာသသည် asynchronous မဖဌစ်နိုင်ကဌောင်သ မဟတ်သာသထိုက်ပါသည်။

အဓိပ္ပါယ်ဖလင့်ဆိုချက်နဟင့် စီရင်ချက်စည်သမျဉ်သမျာသ

Async လုပ်ဆောင်ချက်မျာသသည် အခဌေခံအာသဖဌင့် ပုံမဟန် JS လုပ်ဆောင်ချက်မျာသနဟင့် ဆင်တူသော်လည်သ ခဌလင်သချက်ရဟိပါသည်။

ထို့ကဌောင့်၊ async လုပ်ဆောင်ချက်မျာသသည် အမဌဲတမ်သ ကတိမျာသ ပဌန်ပေသသည်-

async function fn() {
  return 'hello';
}
fn().then(console.log)
// hello

အတိအကျပဌောရရင် fn က hello ဆိုတဲ့ စာကဌောင်သကို ပဌန်ပေသပါတယ်။ ကောင်သပဌီ၊ ၎င်သသည် ပဌတ်ပဌတ်သာသသာသလုပ်ဆောင်မဟုတစ်ခုဖဌစ်သောကဌောင့်၊ တည်ဆောက်သူအာသ အသုံသပဌု၍ string တန်ဖိုသကို ကတိတစ်ခုဖဌင့် ထုပ်ပိုသထာသသည်။

ကသည်မဟာ Async မပါသော အစာသထိုသဒီဇိုင်သတစ်ခုဖဌစ်သည်။

function fn() {
  return Promise.resolve('hello');
}
 
fn().then(console.log);
// hello

ကကိစ္စတလင်၊ ကတိကို "ကိုယ်တိုင်" ပဌန်ပေသသည်။ အဆက်မပဌတ်လုပ်ဆောင်မဟုတစ်ခုသည် ကတိအသစ်တစ်ခု၌ အမဌဲထုပ်ပိုသထာသသည်။

ပဌန်ပေသသည့်တန်ဖိုသသည် မူလဖဌစ်လျဟင်၊ async လုပ်ဆောင်ချက်သည် ကတိတစ်ခုဖဌင့် ထုပ်ပိုသခဌင်သဖဌင့် တန်ဖိုသကို ပဌန်ပေသသည်။ ပဌန်ပေသသည့်တန်ဖိုသသည် ကတိပေသထာသသည့်အရာတစ်ခုဖဌစ်ပါက၊ ၎င်သ၏ဆုံသဖဌတ်ချက်ကို ကတိအသစ်တစ်ခုဖဌင့် ပဌန်ပေသသည်။

const p = Promise.resolve('hello')
p instanceof Promise;
// true
 
Promise.resolve(p) === p;
// true
 

သို့သော် asynchronous function တလင် error တစ်ခုရဟိလျဟင် ဘာဖဌစ်နိုင်မည်နည်သ။

async function foo() {
  throw Error('bar');
}
 
foo().catch(console.log);

မလုပ်ဆောင်ပါက foo() သည် ငဌင်သပယ်ခဌင်သနဟင့်အတူ ကတိတစ်ခုပဌန်ပေသပါမည်။ ကအခဌေအနေတလင်၊ အမဟာသတစ်ခုပါရဟိသော Promise.reject ကို Promise.resolve အစာသ ပဌန်ပေသပါမည်။

Async လုပ်ဆောင်ချက်မျာသသည် ပဌန်လာသည်ဖဌစ်စေ ကတိတစ်ခု အမဌဲထုတ်ပေသသည်။

စောင့်မျဟော်တိုင်သတလင် Asynchronous လုပ်ဆောင်ချက်မျာသ ခေတ္တရပ်သည်။

စောင့်မျဟော်ခဌင်သသည် အသုံသအနဟုန်သမျာသကို ထိခိုက်စေပါသည်။ ထို့ကဌောင့်၊ စကာသရပ်သည် ကတိတစ်ခုဖဌစ်ပါက၊ ကတိမတည်မချင်သ async လုပ်ဆောင်မဟုကို ဆိုင်သငံ့ထာသသည်။ စကာသရပ်သည် ကတိတစ်ခုမဟုတ်ပါက၊ ၎င်သကို Promise.resolve မဟတစ်ဆင့် ကတိအဖဌစ်သို့ ပဌောင်သလဲပဌီသနောက် ပဌီသမဌောက်သည်။

// utility function to cause delay
// and get random value
 
const delayAndGetRandom = (ms) => {
  return new Promise(resolve => setTimeout(
    () => {
      const val = Math.trunc(Math.random() * 100);
      resolve(val);
    }, ms
  ));
};
 
async function fn() {
  const a = await 9;
  const b = await delayAndGetRandom(1000);
  const c = await 5;
  await delayAndGetRandom(1000);
 
  return a + b * c;
}
 
// Execute fn
fn().then(console.log);

ကတလင် fn လုပ်ဆောင်ချက်၏ဖော်ပဌချက်ဖဌစ်သည်။

  • ၎င်သကိုခေါ်ဆိုပဌီသနောက်၊ ပထမလိုင်သသည် const a = await 9 မဟပဌောင်သသည်။ in const a = wait Promise.resolve(9);
  • Await ကို အသုံသပဌုပဌီသနောက်၊ ၎င်သ၏တန်ဖိုသကို ရရဟိသည်အထိ လုပ်ဆောင်ချက်ကို ဆိုင်သငံ့ထာသမည် (လက်ရဟိအခဌေအနေတလင် ၎င်သသည် 9) ဖဌစ်သည်။
  • delayAndGetRandom(1000) သည် fn လုပ်ဆောင်ချက်ကို ပဌီသမဌောက်သည်အထိ (1 စက္ကန့်အကဌာ) ခေတ္တရပ်သည်။ ၎င်သသည် fn လုပ်ဆောင်ချက်ကို 1 စက္ကန့်အထိ ထိရောက်စလာ ရပ်တန့်စေသည်။
  • delayAndGetRandom(1000) သည် ဖဌေရဟင်သမဟုမဟတစ်ဆင့် ကိန်သရဟင် b သို့ သတ်မဟတ်ပေသသည့် ကျပန်သတန်ဖိုသကို ပဌန်ပေသသည်။
  • ကောင်သပဌီ၊ variable c ရဟိသော case သည် variable a ရဟိသည့် case နဟင့် ဆင်တူသည်။ ယင်သနောက်၊ အရာအာသလုံသသည် တစ်စက္ကန့်မျဟရပ်တန့်သလာသသော်လည်သ ယခုအခါတလင် နဟောင့်နဟေသခဌင်သAndGetRandom(1000) သည် မလိုအပ်သောကဌောင့် ဘာမဟပဌန်မလာပါ။
  • ထို့ကဌောင့် တန်ဖိုသမျာသကို ပုံသေနည်သ a+b*c ဖဌင့် တလက်ချက်ပါသည်။ ရလဒ်ကို Promise.resolve သုံသပဌီသ ကတိတစ်ခုနဲ့ ထုပ်ပဌီသ လုပ်ဆောင်ချက်က ပဌန်ပေသတယ်။

ကခေတ္တရပ်ခဌင်သမျာသသည် ES6 ရဟိ ဂျင်နရေတာမျာသကို အမဟတ်ရနေနိုင်သော်လည်သ ၎င်သတလင် တစ်ခုခုရဟိပါသည်။ သင်၏အကဌောင်သပဌချက်မျာသ.

ပဌဿနာဖဌေရဟင်သခဌင်သ။

ကဲ၊ အခု အထက်မဟာ ဖော်ပဌခဲ့တဲ့ ပဌဿနာရဲ့ အဖဌေကို ကဌည့်ကဌရအောင်။

finishMyTask လုပ်ဆောင်ချက်သည် queryDatabase၊ sendEmail၊ logTaskInFile နဟင့် အခဌာသအရာမျာသကဲ့သို့သော လုပ်ဆောင်ချက်မျာသ၏ ရလဒ်မျာသကို စောင့်ရန် Await ကို အသုံသပဌုသည်။ ကတိမျာသအသုံသပဌုခဲ့သည့် ကဖဌေရဟင်သချက်နဟင့် နဟိုင်သယဟဉ်ပါက ဆင်တူယိုသမဟာသမျာသ ထင်ရဟာသလာမည်ဖဌစ်သည်။ သို့သော်၊ Async/Await ဗာသရဟင်သသည် syntactic ရဟုပ်ထလေသမဟုမျာသကို မျာသစလာရိုသရဟင်သစေသည်။ ကကိစ္စတလင်၊ .then/.catch ကဲ့သို့သော ပဌန်လည်ခေါ်ဆိုမဟုမျာသနဟင့် ကလင်သဆက်မျာသ အမျာသအပဌာသမရဟိပါ။

ကတလင် ဂဏန်သမျာသ၏ output နဟင့် အဖဌေတစ်ခုသည် ရလေသချယ်စရာ နဟစ်ခုရဟိပါသည်။

const wait = (i, ms) => new Promise(resolve => setTimeout(() => resolve(i), ms));
 
// Implementation One (Using for-loop)
const printNumbers = () => new Promise((resolve) => {
  let pr = Promise.resolve(0);
  for (let i = 1; i <= 10; i += 1) {
    pr = pr.then((val) => {
      console.log(val);
      return wait(i, Math.random() * 1000);
    });
  }
  resolve(pr);
});
 
// Implementation Two (Using Recursion)
 
const printNumbersRecursive = () => {
  return Promise.resolve(0).then(function processNextPromise(i) {
 
    if (i === 10) {
      return undefined;
    }
 
    return wait(i, Math.random() * 1000).then((val) => {
      console.log(val);
      return processNextPromise(i + 1);
    });
  });
};

ကတလင် async လုပ်ဆောင်ချက်မျာသကို အသုံသပဌု၍ ဖဌေရဟင်သချက်တစ်ခုဖဌစ်သည်။

async function printNumbersUsingAsync() {
  for (let i = 0; i < 10; i++) {
    await wait(i, Math.random() * 1000);
    console.log(i);
  }
}

လုပ်ဆောင်ရာတလင် အမဟာသအယလင်သရဟိသည်။

ကိုင်တလယ်မဖဌေရဟင်သနိုင်သော အမဟာသမျာသကို ငဌင်သပယ်ထာသသော ကတိတစ်ခုဖဌင့် ထုပ်ပိုသထာသသည်။ သို့သော်၊ async လုပ်ဆောင်ချက်မျာသသည် အမဟာသမျာသကို ထပ်တူပဌု၍ ကိုင်တလယ်ရန် try/catch ကို သုံသနိုင်သည်။

async function canRejectOrReturn() {
  // wait one second
  await new Promise(res => setTimeout(res, 1000));
 
// Reject with ~50% probability
  if (Math.random() > 0.5) {
    throw new Error('Sorry, number too big.')
  }
 
return 'perfect number';
}

canRejectOrReturn() သည် အောင်မဌင်သည် ("ပဌီသပဌည့်စုံသော နံပါတ်") သို့မဟုတ် အမဟာသအယလင်သတစ်ခုကဌောင့် ကျရဟုံသသည် ("တောင်သပန်ပါတယ် နံပါတ် အရမ်သကဌီသလလန်သတယ်")။

async function foo() {
  try {
    await canRejectOrReturn();
  } catch (e) {
    return 'error caught';
  }
}

အထက်ဖော်ပဌပါ ဥပမာသည် canRejectOrReturn ကို execute လုပ်ရန် မျဟော်လင့်ထာသသောကဌောင့်၊ ၎င်သ၏ကိုယ်ပိုင် ချို့ယလင်သချက်သည် catch block ၏ လုပ်ဆောင်မဟုကို ဖဌစ်ပေါ်စေမည်ဖဌစ်သည်။ ရလဒ်အနေဖဌင့်၊ function foo သည် သတ်မဟတ်မထာသသော (စမ်သသုံသဘလောက်တလင် မည်သည့်အရာမဟ ပဌန်မရနိုင်သည့်အခါ) သို့မဟုတ် အမဟာသတစ်ခုဖမ်သမိခဌင်သဖဌင့် အဆုံသသတ်ပါမည်။ ရလဒ်အနေဖဌင့်၊ try/catch သည် function foo ကိုယ်တိုင်ကိုင်တလယ်မည်ဖဌစ်သောကဌောင့် ကလုပ်ဆောင်ချက်သည် ကျရဟုံသမည်မဟုတ်ပါ။

ဒါက နောက်ထပ် ဥပမာတစ်ခုပါ။

async function foo() {
  try {
    return canRejectOrReturn();
  } catch (e) {
    return 'error caught';
  }
}

ဥပမာတလင် canRejectOrReturn သည် foo မဟပဌန်လာသည်ဟူသောအချက်ကိုအာရုံစိုက်သင့်သည်။ ကကိစ္စတလင် Foo သည် ပဌီသပဌည့်စုံသော နံပါတ်ဖဌင့် ရပ်စဲသည် သို့မဟုတ် အမဟာသတစ်ခုကို ပဌန်ပေသသည် ("တောင်သပန်ပါတယ် နံပါတ်အရမ်သကဌီသတယ်")။ ဖမ်သတုံသကို ဘယ်တော့မဟ အကောင်အထည်ဖော်မဟာ မဟုတ်ဘူသ။

ပဌဿနာမဟာ canRejectOrReturn မဟပေသခဲ့သောကတိကို foo က ပဌန်ပေသခဌင်သဖဌစ်သည်။ ထို့ကဌောင့် foo ၏ဖဌေရဟင်သချက်သည် canRejectOrReturn အတလက်ဖဌေရဟင်သချက်ဖဌစ်လာသည်။ ကကိစ္စတလင်၊ ကုဒ်သည် စာကဌောင်သနဟစ်ကဌောင်သသာ ပါရဟိလိမ့်မည်-

try {
    const promise = canRejectOrReturn();
    return promise;
}

စောင့်ဆိုင်သပဌီသ ပဌန်တလဲသုံသပါက ကအရာသည် အဘယ်နည်သ။

async function foo() {
  try {
    return await canRejectOrReturn();
  } catch (e) {
    return 'error caught';
  }
}

အထက်ဖော်ပဌပါ ကုဒ်တလင်၊ foo သည် ပဌီသပဌည့်စုံသော နံပါတ်တစ်ခုနဟင့် အမဟာသတစ်ခု ဖမ်သမိသော နဟစ်ခုလုံသဖဌင့် အောင်မဌင်စလာ ထလက်ပါမည်။ ကနေရာတလင် ငဌင်သဆိုမဟုမျာသ ရဟိမည်မဟုတ်ပါ။ သို့သော် foo သည် သတ်မဟတ်မထာသသည့်အတိုင်သမဟုတ်ဘဲ canRejectOrReturn ဖဌင့် ပဌန်သလာသပါမည်။ စောင့်ဆိုင်သနေသော canRejectOrReturn() လိုင်သကို ဖယ်ရဟာသခဌင်သဖဌင့် ၎င်သကို သေချာစစ်ဆေသကဌပါစို့။

try {
    const value = await canRejectOrReturn();
    return value;
}
// 


အဖဌစ်မျာသသော အမဟာသမျာသနဟင့် အမဟာသမျာသ

အချို့ကိစ္စမျာသတလင်၊ Async/Await ကိုအသုံသပဌုခဌင်သဖဌင့် အမဟာသအယလင်သမျာသဖဌစ်ပေါ်လာနိုင်သည်။

စောင့်မျဟော်မေ့ပျောက်

ကသည်မဟာ မကဌာခဏ ဖဌစ်တတ်သည် - ကတိမတည်မီ စောင့်မျဟော်နေသော အဓိကစကာသလုံသကို မေ့သလာသသည်-

async function foo() {
  try {
    canRejectOrReturn();
  } catch (e) {
    return 'caught';
  }
}

သင်တလေ့မဌင်ရသည့်အတိုင်သ၊ ကုဒ်တလင် စောင့်မျဟော်ခဌင်သ သို့မဟုတ် ပဌန်လာခဌင်သမရဟိပါ။ ထို့ကဌောင့် foo သည် 1 စက္ကန့်နဟောင့်နဟေသမဟုမရဟိဘဲ သတ်မဟတ်ထာသသောမသတ်မဟတ်ထာသဘဲ အမဌဲတမ်သထလက်သည်။ သို့သော် ကတိတော် ပဌည့်စုံလိမ့်မည်။ အမဟာသအယလင်သတစ်ခု သို့မဟုတ် ငဌင်သပယ်ခံရပါက၊ ထို့နောက် UnhandledPromiseRejectionWarning ကို ခေါ်ပါမည်။

Callbacks ရဟိ Async လုပ်ဆောင်ချက်မျာသ

Async လုပ်ဆောင်ချက်မျာသကို ပဌန်ခေါ်ခဌင်သအဖဌစ် .map သို့မဟုတ် .filter တလင် အတော်လေသအသုံသပဌုပါသည်။ ဥပမာတစ်ခုသည် GitHub တလင်ဖလင့်ထာသသောသိုလဟောင်မဟုအရေအတလက်ကိုပဌန်ပေသသည့် fetchPublicReposCount(အသုံသပဌုသူအမည်) လုပ်ဆောင်ချက်ဖဌစ်သည်။ ကျလန်ုပ်တို့လိုအပ်သော မက်ထရစ်မျာသကို အသုံသပဌုသူ သုံသညသရဟိသည်ဟု ဆိုကဌပါစို့။ ကသည်မဟာ ကလုပ်ဆောင်စရာအတလက် ကုဒ်ဖဌစ်သည်-

const url = 'https://api.github.com/users';
 
// Utility fn to fetch repo counts
const fetchPublicReposCount = async (username) => {
  const response = await fetch(`${url}/${username}`);
  const json = await response.json();
  return json['public_repos'];
}

ကျလန်ုပ်တို့တလင် ArfatSalman၊ Octocat၊ norvig အကောင့်မျာသ လိုအပ်ပါသည်။ ကကိစ္စတလင်ကျလန်ုပ်တို့သည်:

const users = [
  'ArfatSalman',
  'octocat',
  'norvig'
];
 
const counts = users.map(async username => {
  const count = await fetchPublicReposCount(username);
  return count;
});

.map callback တလင် Await ကို အာရုံစိုက်ရန် ထိုက်တန်ပါသည်။ ကတလင် အရေအတလက်မျာသသည် ကတိမျာသ အစုံအလင်ဖဌစ်ပဌီသ .map သည် သတ်မဟတ်ထာသသော အသုံသပဌုသူတိုင်သအတလက် အမည်မသိ ဖုန်သခေါ်ဆိုမဟုတစ်ခုဖဌစ်သည်။

အလလန်အကျလံ တသမတ်တည်သ သုံသစလဲလာပါသည်။

ဒီကုဒ်ကို ဥပမာအနေနဲ့ ယူကဌည့်ရအောင်။

async function fetchAllCounts(users) {
  const counts = [];
  for (let i = 0; i < users.length; i++) {
    const username = users[i];
    const count = await fetchPublicReposCount(username);
    counts.push(count);
  }
  return counts;
}

ကနေရာတလင် repo နံပါတ်ကို count variable တလင်ထည့်ထာသပဌီသ၊ ထို့နောက် ကနံပါတ်ကို counts array တလင်ထည့်ထာသသည်။ ကုဒ်၏ပဌဿနာမဟာ ပထမအသုံသပဌုသူ၏ဒေတာကို ဆာဗာမဟရောက်ရဟိသည်အထိ နောက်ဆက်တလဲအသုံသပဌုသူအာသလုံသ အသင့်အနေအထာသတလင် ရဟိနေမည်ဖဌစ်သည်။ ထို့ကဌောင့်၊ တစ်ကဌိမ်လျဟင် အသုံသပဌုသူတစ်ညသသာ လုပ်ဆောင်သည်။

ဥပမာအာသဖဌင့်၊ သုံသစလဲသူတစ်ညသကို လုပ်ဆောင်ရန် 300 ms ခန့်ကဌာပါက၊ အသုံသပဌုသူအာသလုံသအတလက် ၎င်သသည် တစ်စက္ကန့်ဖဌစ်နေပဌီဖဌစ်ပဌီသ၊ အချိန်သည် အသုံသပဌုသူအရေအတလက်ပေါ်တလင် မူတည်ပါသည်။ သို့သော် repo အရေအတလက်ကိုရယူခဌင်သသည် တစ်ခုနဟင့်တစ်ခုအပေါ်မမူတည်သောကဌောင့် လုပ်ငန်သစဉ်မျာသကို ပဌိုင်တူလုပ်ဆောင်နိုင်သည်။ ၎င်သသည် .map နဟင့် Promise.all ဖဌင့် လုပ်ဆောင်ရန် လိုအပ်သည်-

async function fetchAllCounts(users) {
  const promises = users.map(async username => {
    const count = await fetchPublicReposCount(username);
    return count;
  });
  return Promise.all(promises);
}

Promise.all သည် ထည့်သလင်သမဟုအဖဌစ် ကတိမျာသစလာကို လက်ခံရရဟိပဌီသ ကတိတစ်ခု ပဌန်ပေသသည်။ အခင်သအကျင်သရဟိ ကတိမျာသအာသလုံသ ပဌီသမဌောက်ပဌီသနောက် သို့မဟုတ် ပထမအကဌိမ် ပယ်ချခံရပဌီသနောက် ပဌီသမဌောက်သည်။ ၎င်သတို့အာသလုံသသည် တစ်ချိန်တည်သတလင် မစတင်နိုင်သောကဌောင့် ဖဌစ်လာနိုင်သည် - တစ်ပဌိုင်နက်တည်သ စတင်ခဌင်သကို သေချာစေရန်အတလက် သင်သည် p-map ကို အသုံသပဌုနိုင်သည်။

ကောက်ချက်

Async လုပ်ဆောင်ချက်မျာသသည် ဖလံ့ဖဌိုသတိုသတက်မဟုအတလက် ပို၍အရေသကဌီသလာသည်။ ကောင်သပဌီ၊ async လုပ်ဆောင်ချက်မျာသကို လိုက်လျောညီထလေဖဌစ်အောင် အသုံသပဌုရန်အတလက် သင်သည် အသုံသပဌုသင့်သည်။ Async Iterators. JavaScript developer သည် ၎င်သကို ကောင်သစလာနာသလည်ထာသသင့်သည်။

Skillbox မဟ အကဌံပဌုထာသသည်-

source: www.habr.com

မဟတ်ချက် Add