1、try catch 是最常见的错误处理方式
缺点:只能捕获同步的错误,对于异步的错误是无法捕获的
try {
await Promise.reject('error')
} catch (error){
console.log(error)
}
2、Promise.prototype.catch
Promise提供了catch方法,用于捕获Promise的错误
Promise.reject('error').catch((error) => {
console.log(error)
})
这种方式是比较常用的方式,因为它不仅可以捕获同步的错误,还可以捕获异步的错误
async function test(){
await Promise.reject("error")
}
test().catch((error) => {
console.log(error)
})
3、Promise.prototype.then
Promise提供了then方法,用于捕获Promise的成功和失败
Promise.reject("error").then(
(value) => {
console.log(value)
},
(error) => {
console.log(error)
}
)
4、链式调用
上面说的几种错误方式都是对Promise的单次调用,怎么样处理都是可以的;
但是Promise的出现就是为了解决回调地狱的问题,所以我们经常会使用链式调用的方式
await Promise.reject('error')
await Promise.reject('error')
await Promise.reject('error')
通常我们会想上面这样,通过await来简化链式调用的负担,但是这样的话,我们对错误的处理就会变得很麻烦:
统一使用一个大的try chatch来捕获所有的错误
try {
await Promise.reject('error')
await Promise.reject('error')
await Promise.reject('error')
} catch (error) {
console.log(error)
}
但是这样的话,我们就无法知道是哪个Promise出现了错误,无法保证后续的Promise能够正常执行。
使用Promise.prototype.catch来捕获每个Promise的错误
const errorHandle = (error) => {
console.log(error)
}
await Promise.reject('error').catch(errorHandle)
await Promise.reject('error').catch(errorHandle)
await Promise.reject('error').catch(errorHandle)
这样我们需要为每个Promise都写一个错误处理函数
链式处理
const await1 = async () => {
await Promise.reject('error')
}
const await2 = async () => {
await Promise.reject('error')
}
const await3 = async () => {
await Promise.reject('error')
}
await1()
.then(await2)
.then(await3)
.catch((error) => {
console.log(error)
})
这种方式其实和使用一个大的try catch是一样的,不过还可以衍生出下面的方式
await1()
.then(await2)
.catch(errorHandle)
.then(await3)
.catch(errorHandle)
// 或者
await1()
.then(await2, errorHandle)
.then(await3, errorHandle)
.catch(errorHandle)
显然这样很麻烦,然后还可以借助Promise.all 或者 Promise.race来简化
Promise.all([await1(),await2(),await3()])
.then(([data1, data2, data3])=>{
console.loe('success')
})
当然Promise.all 的特点大家都清楚,如果其中一个Promise出现错误,那么整个Promise都会失败,然后就有了Promise.race
Promise.race([await1(),await2(),await3()])
.then(()=>{
console.loe('success')
})
这样的话,只要有一个Promise成功,那么整个Promise就会成功,弥补了Promise.all的不足。