В чем разница между использованием Promise.catch () и переносом Promise в try ... catch? - PullRequest
0 голосов
/ 09 ноября 2018

Я сидел сегодня, слушая урок Javascript, и они рассказывали о том, чего я раньше не видел и чего я не до конца понимаю. Я постараюсь воспроизвести как можно лучше из памяти

Вместо использования catch Обещания для обработки ошибок, к которому я привык, учитель использовал try...catch, обернутый вокруг Обещания и его then s. Когда я спросил его, почему он это сделал, он сказал, что это должно быть «синхронно». То есть вместо следующего формата (я использую псевдокод), к которому я привык

someLibrary.someFunctionThatReturnsAPromise
.then(() => something)
.then(() => somethingElse)
.catch(err => reportError)

он сделал это таким образом

try {
 someLibrary.someFunctionThatReturnsAPromise
    .then(() => something)
    .then(() => somethingElse)
} 
catch(err) {
  reportError
}

Какая разница между этими двумя способами обнаружения ошибки? Как упаковка Promise, которая является асинхронной, сообщает об ошибках синхронно?

Спасибо за любые идеи!

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

try-catch не будет отлавливать асинхронные ошибки вокруг <somePromise>.then, поскольку, как вы заметили, блок завершится до того, как обещание будет выполнено / потенциально выполнено.

Однако, если вы используете async / await, то try-catch перехватит, поскольку блок будет ожидать await:

async function foobar() {
  try {
    await doSomePromise();
  } catch (e) {
    console.log(e);
  }
}
0 голосов
/ 09 ноября 2018
  1. поймать после этого (первый пример) это короткий способ обработать только ошибку из вашего обещания.Это то же самое, что .then (null, (err) => reportError), поскольку затем принимает два параметра: для выполненного и отклоненного состояния обещания.
  2. короче попробуйте перехватить блок (второй пример) - is isраспространенный способ обработки вашего кода.если вы что-то из своего кода не только потерпели неудачу, но и сделали что-то после этого.Try / catch работает только в режиме синхронизации, поэтому если вы работаете с асинхронным кодом, вы должны обернуть его, например, в асинхронный / ожидающий способ.

На самом деле вы также можете использовать 3 операторапосле ловли - наконец-то, но это зависит)

0 голосов
/ 09 ноября 2018

Версия try/catch будет перехватывать ошибку только в том случае, если ошибка выдается, когда выполняется исходный (синхронный) код - она ​​не будет перехватывать ошибки, выданные внутри любого из .then s. :

try {
  Promise.resolve()
    .then(() => {
      throw new Error()
    });
} catch(e) {
  console.log('caught');
}

Таким образом, единственный способ, которым ошибка будет обнаружена с try/catch в вашем коде, это если someLibrary.someFunctionThatReturnsAPromise генерирует синхронно. С другой стороны, версия .then / .catch перехватит любую ошибку (и почти наверняка предпочтительнее).

...