Как вызвать метод catch () "try catch" для исключения из обещания? - PullRequest
0 голосов
/ 06 января 2020

Другими словами, мы обычно не можем «попытаться перехватить» исключение, просто вызвав другой метод.

Но мы можем обработать исключение обещания с помощью

promise
  .then()
  .catch();

или

promise
  .then(fulfillmentHandler, rejectionHandler);

Если promise.then() в первом случае вызвало исключение, как можно вызвать catch(), который является методом, для этого обещания обработать исключение, которое произошло ранее?

Обычно мы нужно обработать исключение, обернув его с помощью

try {
  // doSomething
} catch (err) {
  // handle the error
}

, поэтому, если исключение произошло для обещания, которое вернул then(), не должен ли код обрабатывать исключение при запуске promise.then()? Простой вызов метода для объекта обычно не сможет обработать его исключение (в этом случае вызовет catch() для обещания, которое вернул then()), потому что такого переноса нет?

Ответы [ 2 ]

0 голосов
/ 08 января 2020

если исключение произошло для обещания, которое вернул then(), не должен ли код обрабатывать исключение при запуске promise.then()?

Исключение, которое будет произойти в Обещании, возвращенном then, еще не произошло бы, это произойдет только в микро-задаче этого Обещания, после того, как основное задание выполнено.

Promise.resolve()
  .then( callback )
  // still synchronously in the main task, no error yet
  .catch( console.error );
console.log( "done with main task" );

// this will only get executed in a micro-task, when the main task is done
function callback() {
  console.log( "will now throw" );
  throw new Error( "not good" );
}

Таким образом, объекты Promise, возвращаемые этими .then() и .catch(), смогут просто нормально добавлять обратные вызовы, и ничто в основной задаче не выдаст.



Единственное, что может сбить с толку - это конструктор Promise, который синхронно переносит исключения:

const promise = new Promise( () => {
 console.log( "will now throw" );
 throw new Error( "not good" );
} );
console.log( "yet here we are fine" );

Но это не сильно отличается от событий:

addEventListener( 'test', e => {
  console.log( "will now throw" );
  throw new Error( "not good" );
} );

dispatchEvent( new Event( "test" ) );
console.log( "Yet we are fine" );
0 голосов
/ 06 января 2020

Лучшее, что вы можете сделать, - это поискать многозаполнение обещания.

Любая функция, переданная обещанию, в конструкторе или в .then, обратный вызов внутренне оборачивается в try-catch, и если эта функция выбрасывает , это вызовет следующий .catch (или выдаст необработанную ошибку отказа от обещания).

Обещание упаковки в try-catch, однако, не поймает необработанные отклонения, поскольку они несколько особенные. Чтобы поймать их, вы должны использовать это: ( ссылка )

window.addEventListener('unhandledrejection', function(event) {
    console.error(`Unhandled rejection (promise: ${event.promise}, reason: ${event.reason}).`);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...