Async/Await 你是会用,但是你知道怎么处理错误吗?

开发 前端
to函数返回一个Promise且值是一个数组,数组之中有两个元素,如果索引为0的元素不为空值,说明该请求报错,如果索引0的元素为空值说明该请求没有报错,也就是成功。

前言

大家好,我是林三心,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心

Promise封装请求

大家平时如果使用Promise封装请求,那么当你使用这个请求函数的时候是这样的:

// 封装请求函数
const request = (url, params) => {
return new Promise((resolve, reject) => {
// ...do something
})
}

// 使用时
const handleLogin = () => {
request(
'/basic/login',
{
usename: 'sunshine',
password: '123456'
}
).then(res => {
// success do something
}).catch(err => {
// fail do something
})
}

可以看到,当你的请求成功时,会调用then方法,当你的请求失败时会调用catch方法。

async/await

Promise的出现解决了很多问题,但是如果请求多了且有顺序要求的话,难免又会出现嵌套的问题,可读性较差,比如:

const handleLogin = () => {
request(
'/basic/login',
{
usename: 'sunshine',
password: '123456'
}
).then(res => {
// 登录成功后获取用户信息
request(
'/basic/getuserinfo',
res.id
).then(info => {
this.userInfo = info
}).catch()
}).catch(err => {
// fail do something
})

所以这个时候async/await出现了,他的作用是:用同步的方式执行异步操作,上面的代码使用async/await的话可以改写成:

const handleLogin = async () => {
const res = await request('/basic/login', {
usename: 'sunshine',
password: '123456'
})
const info = await request('/basic/getuserinfo', {
id: res.id
})
this.userInfo = info
}

这样的话代码的可读性比较高,而不会出现刚刚的嵌套问题,但是现在又有一个问题了,Promise有catch这个错误回调来保证请求错误后该做什么操作,但是async/await该如何捕获错误呢?

async-to-js

其实已经有一个库async-to-js已经帮我们做了这件事,我们可以看看它是怎么做的,它的源码只有短短十几行,我们应该读读它的源码,学学它的思想

源码很简单

/**
* @param { Promise } 传进去的请求函数
* @param { Object= } errorExt - 拓展错误对象
* @return { Promise } 返回一个Promise
*/
export function to(
promise,
errorExt
) {
return promise
.then(data => [null, data])
.catch(err => {
if (errorExt) {
const parsedError = Object.assign({}, err, errorExt)
return [parsedError, undefined]
}

return [err, undefined]
})
}

export default to

源码总结:to函数返回一个Promise且值是一个数组,数组之中有两个元素,如果索引为0的元素不为空值,说明该请求报错,如果索引0的元素为空值说明该请求没有报错,也就是成功。

使用很简单

我们该怎么去使用这个to函数呢?其实很简单,还是刚刚的例子

const handleLogin = async () => {
const [resErr, res] = await to(request('/basic/login', {
usename: 'sunshine',
password: '123456'
}))
if (resErr) {
// fail do somthing
return
}
const [userErr, info] = await to(request('/basic/getuserinfo', {
id: res.id
}))
if (userErr) {
// fail do somthing
return
}
this.userInfo = info
}

所以说,偶尔看看一些库的源码,还是能学到东西的!!!

责任编辑:武晓燕 来源: 前端之神
相关推荐

2024-04-08 00:00:00

asyncawaiPromise

2019-01-28 17:42:33

Python数据预处理数据标准化

2010-11-23 10:21:53

跳槽

2013-02-27 10:27:44

GitHub

2024-02-19 00:00:00

Docker轻量级容器

2021-01-21 09:09:18

时区转换程序

2024-03-12 08:37:32

asyncawaitJavaScript

2024-03-06 09:24:50

AsyncAwaitC#

2015-12-01 13:33:51

UnikernelLinux运维

2021-11-12 05:59:23

容灾备份5G

2023-12-20 08:23:53

NIO组件非阻塞

2022-09-28 18:16:34

JavaJDK

2024-03-05 18:15:28

AsyncAwait前端

2020-12-18 08:59:51

苹果iCloud储存照片

2023-06-30 08:26:24

Java注解Java程序元素

2020-12-08 09:25:41

死锁MySQL数据库

2023-06-08 08:06:07

error错误页原理

2023-01-31 09:02:24

JSVMVR

2020-09-03 06:42:12

线程安全CPU

2019-03-14 12:39:55

安全云计算深信服
点赞
收藏

51CTO技术栈公众号