为什么我收到“(node:7424)UnhandledPromiseRejectionWarning”消息以获取已处理的错误?

时间:2019-01-05 08:26:46

标签: javascript node.js promise

我通过catch处理Promise中的错误,但是在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 :(得分:2)

每当在现有Promise上调用.then(或.catch)时,您都有一个 new 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');