JavaScript တွင် Promise များ၏ကွင်းဆက်များအတွင်းရှိ ခြွင်းချက်များ
အကြောင်းအမျိုးမျိုးကြောင့် ကျွန်ုပ်တို့၏ Promise သည် အမှားတစ်ခုနှင့် ပြီးဆုံးသွားသည်ဆိုပါစို့။
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
ဤကိစ္စတွင် ကုဒ်အလုပ်လုပ်ခြင်းသည် တန်းလန်း
အမှားကို ကိုင်တွယ်သည့်လုပ်ဆောင်ချက် ပါရှိသော then သို့မဟုတ်
ပထမဆုံးတွေ့ရှိရသော catch သို့ ချက်ချင်းပင် ကူးပြောင်းသွားမည်ဖြစ်သည်။
ပထမအခြေအနေအတွက် နမူနာတစ်ခုမှာ
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// အလုပ်လုပ်ခြင်းသည် ဒီကို တန်းလန်းကူးပြောင်းသွားမည်
}
).then(
function(result) {
console.log(result);
}
);
ဒုတိယအခြေအနေအတွက် နမူနာတစ်ခုမှာ
promise.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 ကို ထားရှိသည်။
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// အမှားဖြစ်ပါက ဒီကိုရောက်လာမည်
}
);
ဤသို့ဖြင့် ခြွင်းချက်သည် Promise ကိုယ်၌ပင်ဖြစ်စေ၊
သို့မဟုတ် ကွင်းဆက်ရှိ မည်သည့်အဆင့်၌မဆို throw မှတစ်ဆင့်
ပစ်ချခံရနိုင်သည်။
promise.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 သည်
၎င်းကို မည်သို့ဖြေရှင်းရမည်ကို မသိပါက) ကျွန်ုပ်တို့သည်
ဘာမှမပြန်ဘဲထားရမည် သို့မဟုတ် ခြွင်းချက်တစ်ခုကို ပစ်ရမည်။
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (အမှားကိုဖြေရှင်းနိုင်သည်) {
return 'ဒေတာ'; // နောက် then သို့ ပေးပို့သည်
} else {
// ဘာမှမပြန်ဘဲထားသည် သို့မဟုတ် ခြွင်းချက်ပစ်သည်
}
}
).then(
function(result) {
// ဒီမှာ အမှားကို ဖြေရှင်းသည်
}
);