Ответ 1
Ваш первый пример возвращает оригинальное обещание. Второй пример возвращает другое обещание, которое создается при вызове catch
.
Критические различия между ними:
-
В вашем втором примере вы не передаете значение разрешения, поэтому обещание, возвращаемое вашим
then
, разрешено с помощьюundefined
(возвращаемое значениеconsole.log
). -
В вашем втором примере вы конвертируете отклонения в разрешения с помощью
undefined
(возвращая результатconsole.log
изcatch
). Acatch
, который не бросает или не возвращает обещание, которое отклоняет, преобразует отклонение в разрешение.
Одним из ключевых моментов в цепочках обещаний является то, что они преобразуют результат; каждый вызов then
или catch
создает новое обещание, и их обработчики могут изменять то, что отправлено вниз по течению, когда результат проходит через них.
Обычный шаблон действительно должен был бы вернуть результат цепочки, но для функций в цепочке либо намеренно преобразовать результат, либо передать его. Как правило, у вас не было бы обработчика catch
, кроме конечного конца цепочки, если вы не используете его для исправления ошибки (намеренно преобразовывая отклонение в разрешение).
Если вы хотите просто зарегистрировать то, что прошло, в то же время позволяя вызывающим абонентам увидеть его, но хотите вернуть результат цепочки по любой причине, вы сделаете следующее:
return request
.then(result => { console.log(result); return result; })
.catch(error => { console.error(error); return Promise.reject(error); });
или используя throw
:
return request
.then(result => { console.log(result); return result; })
.catch(error => { console.error(error); throw error; });