Почему я получаю сообщение "(node: 7424) UnhandledPromiseRejectionWarning" для обработанной ошибки? - PullRequest
0 голосов
/ 05 января 2019

Я исправляю ошибку в моем Promise с помощью catch, но в выводе консоли Node.js (v10.11.0) я вижу сообщение: (node:7424) UnhandledPromiseRejectionWarning: Error: Oops...

Почему это происходит?

// See browser console, not stack snippet console, to see uncaught error

const p = new Promise((resolve,reject) => { throw new Error('Oops..');});

p.then(()=> console.log('Then'));
p.catch(err => console.log(err.message)); // the error handling

console.log('The end');

Кроме того, я получаю тот же результат для такого варианта инициализации p:

const p = new Promise((resolve,reject) => { reject(new Error('Oops..'));});

Это мой вывод:

Конец
Упс ..
(узел: 7492) UnhandledPromiseRejectionWarning: Ошибка: К сожалению ..

1 Ответ

0 голосов
/ 05 января 2019

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

p.then(()=> console.log('Then'));

нигде не пойман.

Любая цепь .catch соединяется с .then:

const p = new Promise((resolve, reject) => {
  throw new Error('Oops..');
});

p
  .then(() => console.log('Then'))
  .catch(err => console.log(err.message));

console.log('The end');

Обратите внимание, что при создании Promise рекомендуется всегда явным образом вызывать reject при возникновении ошибки, чтобы гарантировать, что потребитель этого Promise может обнаружить проблемы. Например, в следующем коде p будет не отклоняться и останется неразрешенным навсегда, поскольку ошибка возникла асинхронно:

const p = new Promise((resolve, reject) => {
  setTimeout(() => {
    throw new Error('Oops..');
  });
})

p
  .then(() => console.log('Then'))
  .catch(err => console.log(err.message))

console.log('The end');

Лучше позвонить reject:

const p = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('Oops..');
  });
})

p
  .then(() => console.log('Then'))
  .catch(err => console.log(err))

console.log('The end');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...