Почему не правильно работать с ошибкой отклонения - PullRequest
3 голосов
/ 11 июня 2019

Почему обещание поймать не работает с await?

Я хочу поймать ошибку при отклонении, но я получил два результата различия

(async () => {
    var t = (new Promise((r1, r2) => r2(12345))); 
    t.catch(e=> console.log(e)); 
    await t; 
})()

Результаты с ошибкой: VM5989:1 Uncaught (in promise)

(async () => {
    var t = (new Promise((r1, r2) => r2(12345))).catch(e=> console.log(e));
    await t; 
})()

Не вызывает ошибок и возвращает 12345

демонстрационное изображение:

в node@12 / chrome@75 console, я получил результат двух различий.

когда я использую t.catch, я получаю Unhandled promise rejection.

когда я использую (new Promise()).catch, я получил, кроме результата.

почему? И как я могу использовать t и получить правильный результат?

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

В первом примере вы создаете новое обещание, которое обрабатывает исключение, вызывая t.catch(), но вы не присваиваете ему t, поэтому t остается обещанием с необработанным отклонением.

Во втором примере t ссылается на цепочку, которая является обещанием с обработанным отклонением (продолжение .catch() не выбрасывает, поэтому оно разрешается с undefined), поэтому ожидание t не вызовет async функция для выброса.

Однако, поскольку t в первом примере по-прежнему содержит отклоненное обещание, ожидание его вызовет функцию async для выброса.

0 голосов
/ 11 июня 2019

В первом случае, поскольку Promise является асинхронным по своей природе, и оператор r2 уже был выполнен даже до присоединения перехвата.

Это означает, что перехват отсутствовал при вызове r2 - функции отклонения.

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

Редактировать: в ответе @Patrick Roberts,

ошибка не в необработанном улове, а в ожидании rejected t.В то время как в случае второго утверждения t (обещание) все равно было pending.

0 голосов
/ 11 июня 2019

В первом коде вы подключаете цепочку ловушек, и обещание начинается только после цепочки.

//Single promise that starts after the chain
(async () => {
    const t = (new Promise((r1, r2) => r2(12345))).catch(e=> console.log(e));
    await t; 
})()

Во втором фрагменте кода вы ожидаете объект обещания, у которого нет блока catch.

(async () => {
    const t = (new Promise((r1, r2) => r2(12345))); // "A" promise
    t.catch(e=> console.log(e));  // "A" promise + catch = "B" promise
    await t; // You are awaiting for the "A" promise
})()
...