我通过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:错误:糟糕。.
答案 0 :(得分:2)
每当在现有Promise上调用.then
(或.catch
)时,您都有一个 new 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');