.then(f1, f2) 和 .catch(f2) 有区别吗? --<Javascript 学习笔记 8>
Lemon1x 40 0

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 的错误。

评论区

索引目录