Պրոմիսների շղթաներում բացառությունները JavaScript-ում

Ենթադրենք, ինչ-ինչ պատճառներով մեր պրոմիսը ավարտվում է սխալով.

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) {
    // կհայտնվենք այստեղ սխալի դեպքում
  }
);

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