Можно ли отлавливать ошибки между связанными обещаниями? - PullRequest
0 голосов
/ 19 февраля 2019

Так мне интересно, работает ли это?

S3.getObject()
  .promise()
  .then()
  .catch() // catch error from the first then() statement
  .then()
  .catch() // catch error from the second then() statement

или мне нужно поставить все «защелки» в конце?Могу ли я иметь несколько уловов тогда?Будут ли они запускаться в порядке операторов «then», выдающих ошибки?

1 Ответ

0 голосов
/ 19 февраля 2019

Это зависит от ваших реальных целей.

Фактически, метод .then() принимает два параметра:

  • onFullfilled : обратный вызов будетвызывается, когда обещание выполнено.
  • onRejected : обратный вызов, вызываемый при отклонении обещания.

На самом деле, .catch(fn) - это просто сокращениедля .then(null, fn).

Оба .then() и .catch() каждый возвращают новое обещание, которое разрешает к своему возвращаемому значению.Другими словами:

  • Разрешенное обещание этого значения, если оно не обещание.
  • Фактическое возвращаемое значение, если это уже обещание (которое будет выполнено или отклонено).
  • Отклоненное обещание, если возвращаемое значение является отклоненным обещанием (как сказано в предыдущем пункте) или выдается какая-либо ошибка.

Основная причина использования .then(onFullfill).catch(onReject)шаблон вместо .then(onFullfill, onReject) заключается в том, что в первом (что эквивалентно .then(onFullfill).then(null, onReject)) мы приковываем обратный вызов onReject к обещанию, возвращенному первым .then(), а не непосредственно к исходному обещанию.

Следствием этого является то, что если в обратном вызове onFullfill выдается ошибка en (или он возвращает обещание, которое оказывается преобразующимся в отклоненное состояние), оно будет также перехвачено цепочкой .catch().

Итак, отвечая на ваш вопрос, когда вы делаете что-то вроде:

P.then(...)
 .then(...)
 .then(...)
 .catch(...)
;

Вы объединяете обещания, "предполагая, что" все будет хорошо "и только проверяйте в конце".То есть: всякий раз, когда какой-либо шаг заканчивается неудачей, все последующие .then() обойдены до следующего (в данном случае последнего) .catch().

С другой стороны, если вы добавите больше .catch() sв промежутке вы сможете перехватить отклоненные обещания раньше и, при необходимости, решить все происходящее и снова превратить его в разрешенное состояние, чтобы возобновить цепочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...