JavaScript တွင် Promise များ၏ကွင်းဆက်များအတွင်းရှိ ခြွင်းချက်များ

အကြောင်းအမျိုးမျိုးကြောင့် ကျွန်ုပ်တို့၏ Promise သည် အမှားတစ်ခုနှင့် ပြီးဆုံးသွားသည်ဆိုပါစို့။

javascriptlet promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    reject('error');
  }, 3000);
});

ဤကိစ္စတွင် ကုဒ်အလုပ်လုပ်ခြင်းသည် တန်းလန်း အမှားကို ကိုင်တွယ်သည့်လုပ်ဆောင်ချက် ပါရှိသော then သို့မဟုတ် ပထမဆုံးတွေ့ရှိရသော catch သို့ ချက်ချင်းပင် ကူးပြောင်းသွားမည်ဖြစ်သည်။

ပထမအခြေအနေအတွက် နမူနာတစ်ခုမှာ

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  },
  function(error) {
    // အလုပ်လုပ်ခြင်းသည် ဒီကို တန်းလန်းကူးပြောင်းသွားမည်
  }
).then(
  function(result) {
    console.log(result);
  }
);

ဒုတိယအခြေအနေအတွက် နမူနာတစ်ခုမှာ

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    // အလုပ်လုပ်ခြင်းသည် ဒီကို တန်းလန်းကူးပြောင်းသွားမည်
  }
).then(
  function(result) {
    console.log(result);
  }
);

အမှားကိုင်တွယ်သည့်လုပ်ဆောင်ချက်တွင် လုပ်ဆောင်နည်း နှစ်မျိုးရှိသည်။ ၎င်းသည် ခြွင်းချက်အခြေအနေကို ကိုင်တွယ်နိုင်လျှင် return မှတစ်ဆင့် ရလဒ်ကို ပြန်ပေးနိုင်ပြီး အလုပ်လုပ်ခြင်းသည် ကွင်းဆက်တစ်လျှောက် ဆက်လက်ဆင်နွှဲမည်ဖြစ်သည်။ အကယ်၍ ၎င်းသည် အမှားကို ကိုင်တွယ်နိုင်ခြင်းမရှိပါက ဘာမှမပြန်ဘဲထားနိုင်သည် သို့မဟုတ် throw မှတစ်ဆင့် ခြွင်းချက်တစ်ခုကို ပစ်နိုင်သည်။ ဤကိစ္စတွင် အလုပ်လုပ်ခြင်းသည် နောက်အမှားဖမ်းယူသူ (then သို့မဟုတ် catch - ဘယ်ဟာက အရင်တွေ့မည်နည်း) ထံသို့ ကူးပြောင်းသွားမည်ဖြစ်သည်။

ပုံမှန်အားဖြင့် ကွင်းဆက်၏အမှားအားလုံးကို တစ်နေရာတည်းတွင် ဖမ်းယူကြသည်။ ကွင်းဆက်၏အဆုံးတွင် catch ကို ထားရှိသည်။

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    // အမှားဖြစ်ပါက ဒီကိုရောက်လာမည်
  }
);

ဤသို့ဖြင့် ခြွင်းချက်သည် Promise ကိုယ်၌ပင်ဖြစ်စေ၊ သို့မဟုတ် ကွင်းဆက်ရှိ မည်သည့်အဆင့်၌မဆို throw မှတစ်ဆင့် ပစ်ချခံရနိုင်သည်။

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    if (အားလုံးကောင်းမွန်သည်) {
      return result + '2';
    } else {
      throw new Error('အမှား'); // အနီးဆုံးဖမ်းယူသူထံသို့ ကူးပြောင်းသည်
    }
  }
)
.then(
  function(result) {
    return result + '3';
  }
).catch(
  function(error) {
    // အနီးဆုံးဖမ်းယူသူ
  }
);

catch သည် အမှားကို ရှာဖွေစစ်ဆေးရန် အတွက်သာ လိုအပ်ကြောင်း သတိပြုပါ။ ၎င်းကို ဖြေရှင်းနိုင်သလား မဖြေရှင်းနိုင်သလား။ အကယ်၍ အမှားကို ဖြေရှင်းနိုင်ပါက catch သည် ၎င်း၏ဖြေရှင်းချက်ကို ၎င်း၏နောက်မှလာမည့် then ထံသို့ ပေးပို့ရမည်။ အကယ်၍ ဖြေရှင်း၍မရပါက (သို့မဟုတ် ဤ catch သည် ၎င်းကို မည်သို့ဖြေရှင်းရမည်ကို မသိပါက) ကျွန်ုပ်တို့သည် ဘာမှမပြန်ဘဲထားရမည် သို့မဟုတ် ခြွင်းချက်တစ်ခုကို ပစ်ရမည်။

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    if (အမှားကိုဖြေရှင်းနိုင်သည်) {
      return 'ဒေတာ'; // နောက် then သို့ ပေးပို့သည်
    } else {
      // ဘာမှမပြန်ဘဲထားသည် သို့မဟုတ် ခြွင်းချက်ပစ်သည်
    }
  }
).then(
  function(result) {
    // ဒီမှာ အမှားကို ဖြေရှင်းသည်
  }
);