共计 1954 个字符,预计需要花费 5 分钟才能阅读完成。
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 的不足。
原文地址: Promise 的错误处理方式