Истисноҳо дар занҷири ваъдҳо дар JavaScript

Бигзор ба сабабҳое ваъди мо бо хатогӣ анҷом ёбад:

javascriptlet promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    reject('хатогӣ');
  }, 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) {
    // дар ин ҷо хатогиро ҳал мекунем
  }
);