Sobes.tech
Middle

Praktinio pavyzdžio su Promise analizė: kokia tvarka bus rodomi console.log naudojant .then/.catch grandinę? Kas nutiks, jei pašalinsime return iš catch?

sobes.tech AI

Atsakymas iš AI

Рассмотрим цепочку Promise с .then и .catch, например:

Promise.reject('error')
  .then(() => console.log('then1'))
  .catch(() => {
    console.log('catch');
    // return; // что если убрать return?
  })
  .then(() => console.log('then2'));

Порядок вывода будет:

catch
then2

Объяснение:

  • Promise сразу отклоняется с ошибкой 'error'.
  • Первый .then пропускается, так как промис в состоянии rejected.
  • Переходит в .catch, который ловит ошибку и выводит 'catch'.
  • Если внутри catch есть return (даже без значения), следующий .then получает resolved промис и выполняется, выводя 'then2'.

Если убрать return из catch, то:

  • В JavaScript, если функция в .catch не возвращает значение, она возвращает undefined, что считается resolved значением.
  • Поэтому следующий .then всё равно выполнится, и 'then2' выведется.

Итог: убрать return из catch не изменит порядок вывода, так как отсутствие return эквивалентно возврату undefined, что переводит цепочку в resolved состояние.

Если же в catch выбросить ошибку или вернуть отклонённый промис, то следующий then не выполнится.