结论:then中有错误,Promise会自动捕获内部异常,并交给rejected响应函数处理,并不会直接在then中抛出异常
// 声明一个 Promise,并执行 resolve(1)
aaa () {
return new Promise((resolve, reject) => {
resolve(1)
})
}
// 例1:调用上方的Promise,只写then
this.aaa().then(res=>{
console.log(res)
consolo.log(res) => 错误行,console书写错误
})
👉 控制台中结果:① then中的 res被打印 => 1 ② 控制台抛出异常
// 例2:调用上方的Promise,then 和catch 都写
this.aaa().then(res => {
console.log(res)
consolo.log(res) => 错误行,console书写错误
}).catch(err => {
console.log(2)
console.log(err)
})
👉 控制台中结果:① 无报错 ② then中的 res被打印 => 1 ③ catch中的 2被打印 =>2
④ catch中的 err 被打印 => ReferenceError: consolo is not defined
1、语法说明
① promise.then(onFulfilled, onRejected)
如果 promise 成功,onFulfilled 会被调用;如果失败,onRejected 会被调用。重要的是,then 方法返回的是一个新的 Promise 实例(注意,不是原来那个 Promise 实例)。因此可以采用链式写法。
② Promise.catch(onRejected)
catch 实际上是 then(null, onRejected) 的别名。换句话说,它只是 then 的一种特殊形式,专门用来捕捉 promise 的错误。
2、错误处理差异
① 参数差异:then 可以接收两个函数参数,分别对应 Promise 的成功和失败情况。而 catch 只接收一个参数,专门处理失败情况。
② 链式调用中的行为差异:当在 then 的第一个参数(成功回调)中发生异常时,如果没有第二个参数(错误回
调),Promise 将会进入 catch 方法(如果存在的话)。而 catch 中产生的错误 也可以被后续的 catch 捕获。
③ 错误冒泡:catch 在链式调用中具有“错误冒泡”的性质,类似于同步代码中的 try...catch。
即,catch 会捕获之前所有 then 中未处理的错误。