Promise 的错误处理方式

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的不足。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值