Promise 的错误处理方式

7,323次阅读
没有评论

共计 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 的错误处理方式

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-23发表,共计1954字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)