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) {
    // хатолик юз берганда шу ёққа кирамиз
  }
);

Бунда истисно ўзидаги промисда пайдо бўлиши mumkin, ёки 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) {
    // энг яқин ўзловчи
  }
);

Эътибор бering, catch айникса хатоликни диагностика қилиш учун керак: у ҳал қилинадими ёки йўқми. Aгар хатолик ҳал қилинади бўлса, catch унинг ечимини ўзидан кейинги then га ўтказаши керак. Aгар ҳал қилинмаса (ёки маълум catch уни қандай ҳал қилишни билмаса), у ҳолда биз ҳеч нарса қайтармаслигимиз ёки истисно ташлашимиз керак:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    if (хатоликҲалБулади) {
      return 'маълумот'; // кейинги then га юборамиз
    } else {
      // ҳеч нарса қайтармаймиз ёки истисно ташлаймиз
    }
  }
).then(
  function(result) {
    // хатоликни шу ерда ҳал қиламиз
  }
);