JavaScript-da pursatlar zynjyrynda çaklamalar

Gowşuranyň, nämä üçindir biziň pursadymyz säwlik bilen gutarýar:

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

Bu ýagdaýda kodyň ýerine ýetirilmegi derrew geçer o then-a, niredä säwligiň işleýji funksiýasy bar ýa-da birinji catch-a, nämesiniň öňüni alýandygyna garap.

Bu ýerde birinji ýagdaýyň mysaly:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  },
  function(error) {
    // ýerine ýetirilmegi derrew şu ýere geçer
  }
).then(
  function(result) {
    console.log(result);
  }
);

Bu ýerde ikinji ýagdaýyň mysaly:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    // ýerine ýetirilmegi derrew şu ýere geçer
  }
).then(
  function(result) {
    console.log(result);
  }
);

Işleýji funksiýanyň hereket etmek üçin iki warianty bar: eger ol çaklama ýagdaýy bilen işlän bolsa, onda return arkaly netijäni gaýdyp biler we ýerine ýetirilmegi zynjyr boýunça dowam eder. Eger bolsa ol säwlik bilen işlän bolmasa, onda ýa-da hiç zat gaýtarmaz, ýa-da çaklamany throw arkaly taşlap biler. Bu ýagdaýda ýerine ýetirilmegi indiki säwlik tutujy öňüne geçer (then ýa-da catch - nämesiniň öňüni alýandygyna garap).

Adatça, zynjyryň ähli säwlikleri bir ýerde tutulýar: zynjyryň ahyrynda ýerleşdirilýär catch:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    // säwlik ýagdaýynda şu ýere düşeris
  }
);

Şonuň bilen çaklama özünde pursatda döräp biler, ýa-da throw arkaly zynjyryň haýsy hem bolsa bir baglanyşygynyň işinde taşlap biliner:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    if (hemmeGowy) {
      return result + '2';
    } else {
      throw new Error('säwlik'); // iň ýakyn tutujy öňüne geçýäris
    }
  }
)
.then(
  function(result) {
    return result + '3';
  }
).catch(
  function(error) {
    // iň ýakyn tutujy
  }
);

Üns beriň, catch aslynda zerurdyr säwligiň diagnostikasy üçin: oňa çözgüt tapylýarmy ýa-da ýokmy. Eger säwlige çözgüt tapylýan bolsa, onda catch onuň çözgüdini özünden soňky then-e geçirmeli. Eger bolsa çözgüt tabyly bolmasa (ýa-da bu catch diňe onuň nähili çözmelidigini bilmeýän), onda biz ýa-da hiç zat gaýtarmaly däl ýa-da çaklama taşlamaly:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    if (säwlikÇözüliýär) {
      return 'maglumatlar'; // indiki then-e iberýäris
    } else {
      // hiç zat gaýtarmaly däl ýa-da çaklama taşlamaly
    }
  }
).then(
  function(result) {
    // şu ýerde säwligi çözýäris
  }
);