Почему у состояния промиса указано "выполнено", если используется метод reject?

  • 17 августа 2023 г. 3:56
Ответы на вопрос 2
Ответ на ваш вопрос связан с тем, как работают методы `catch` и `then` в промисах.

Когда вы используете метод `catch(null)`, это означает, что вы не обрабатываете ошибку. Фактически, это эквивалентно следующему коду:

```javascript
.catch(null)
```

```javascript
.then(undefined, null)
```

Таким образом, ошибка пропускается и переходит к следующему методу `then`.

Когда обработка ошибки достигает второго метода `catch`, он ловит ошибку и выполняет соответствующий колбэк. Однако, после этого промис переходит в состояние "выполнено" с значением `undefined`.

Это происходит потому, что в этом случае обработка ошибки осуществляется и промис считается успешно выполненным. Значение `undefined` возвращается из первого блока `then`, так как никакого значения не было возвращено явно.

В результате вы видите в выводе "api error", затем "2" и, наконец, состояние промиса "выполнено" с значением `undefined`. Состояние "выполнено" указывает, что промис успешно завершился.
.catch(onRejected) возвращает новый Promise. Этот новый Promise всегда остается в ожидании после возврата, независимо от статуса текущего Promise. Он будет отклонен, если onRejected вызывает ошибку или возвращает Promise, который сам по себе отклонен, в противном случае он будет выполнен. .catch(null) не работает, потому что не указана функция onRejected. Второй .catch возвращает Promise, который выполнен, в соответствии с указаниями спецификации.
Похожие вопросы