Պրոմիսների շղթաներում բացառությունները JavaScript-ում
Ենթադրենք, ինչ-ինչ պատճառներով մեր պրոմիսը ավարտվում է սխալով.
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) {
// կհայտնվենք այստեղ սխալի դեպքում
}
);
Այս դեպքում բացառությունը կարող է առաջանալ հենց
պրոմիսում, կամ նետվել 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) {
// այստեղ լուծում ենք սխալը
}
);