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

Lemon1x
• 阅读 545

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

点赞
收藏
评论区
推荐文章

暂无数据

Lemon1x
Lemon1x
Lv1
男 · 学生
初二的某个班长,目前为JS开发者。 知乎同名,Gitee: Lemonix,Github: Lemonix-xxx
文章
0
粉丝
0
获赞
0
热门文章

暂无数据