Javascript 学习笔记 8
先说结论,有区别,至于为什么,咱慢慢讲。
先看下面的代码:
new Promise((resolve, reject) => {
reject(new Error('FUCK THERE IS A ERROR').message);
// 实际上和 throw new Error 一样
}).then(null, console.error);
new Promise((resolve, reject) => {
reject(new Error('FUCK THERE IS A ERROR').message);
}).catch(console.error);
好吧,实际上这时是没有区别的,但是如果我们把 then 的第一个参数修改一下就有区别了:
new Promise((resolve, reject) => {
resolve()
})
.then(() => foo())
.catch(x => console.error('ERROR:', x.message));
// ERROR: ReferenceError: foo is not defined
new Promise((resolve, reject) => {
resolve();
})
.then(() => foo(), x => console.error('ERROR:', x.message));
// ReferenceError: foo is not defined
这时前者捕捉到了错误,但是后者却报错终止了程序,因为 result/reject 是以 Promise 链 (Chain) 的形式传递的,但是后者并不构成链,当第一个参数报错时,第二个参数不会捕捉错误。
所以一定要小心, Promise 中报错的不一定是 Excutor ,也有可能是 Handler 。
总结
.then(null, f) 不捕捉 Handler 的错误; .catch(f) 既捕捉 Excutor 的错误,也捕捉 Handler 的错误。