Sobes.tech
Middle

Grandinė iš karto tampa rejected, pirmas .then praleidžiamas. Pirmas .catch pagauna klaidą Išvestis: Catch 1: Klaida1 Grąžina 'Kita reikšmė', klaidą paverčiant sėkmingu rezultatu. Sekantis .then gauna 'Kita reikšmė' Išvestis: Then 2: Kita reikšmė Tada meta naują klaidą: throw new Error('Antroji klaida') Grandinė vėl tampa rejected. Antras .catch pagauna antrą klaidą Išvestis: Catch 2: Antroji klaida Nieko negrąžina → rezultatas yra undefined. Paskutinis .then gauna undefined Išvestis: Then 3: undefined Priimkite pasveikinimą! ("Klaida!") — tai pažadas, kuris iš karto atmestas su klaida "Klaida!" .then(1) — praleidžiamas, nes pažadas yra rejected būsenoje .catch(1) — pagauna klaidą, rodo "Catch 1: Klaida!" ir grąžina "DUOMENYS GRĄŽINTI" .then(2) — gauna "DUOMENYS GRĄŽINTI", rodo "Tikeris? DUOMENYS GRĄŽINTI" ir meta naują klaidą "Antroji klaida" .catch(2) — pagauna antrą klaidą, rodo "Catch 2: Antroji klaida" .then(3) — gauna undefined (nes ankstesnis catch nieko negrąžino), rodo "then 3: undefined"

sobes.tech AI

Atsakymas iš AI

В цепочке промисов, если промис отклонён (rejected), первый .then пропускается, и управление переходит к ближайшему .catch.

  • Первый .catch ловит ошибку, выводит сообщение и возвращает значение, превращая ошибку в успешный результат.
  • Следующий .then получает это значение, выводит его и выбрасывает новую ошибку.
  • Второй .catch ловит новую ошибку, выводит сообщение, но ничего не возвращает, поэтому результатом становится undefined.
  • Последний .then получает undefined и выводит его.

Пример:

Promise.reject('Ошибка!')
  .then(() => console.log('Этот then пропускается'))
  .catch(err => {
    console.log('Catch 1:', err); // Catch 1: Ошибка!
    return 'Другое значение';
  })
  .then(value => {
    console.log('Then 2:', value); // Then 2: Другое значение
    throw new Error('Вторая ошибка');
  })
  .catch(err => {
    console.log('Catch 2:', err.message); // Catch 2: Вторая ошибка
  })
  .then(value => {
    console.log('Then 3:', value); // Then 3: undefined
  });

Таким образом, .catch может преобразовать ошибку в успешный результат, позволяя цепочке продолжаться, а если ошибка выбрасывается снова, цепочка снова становится отклонённой.