[转帖]async/await 函数到底要不要加 try catch ?
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
前言写异步函数的时候,promise 和 async 两种方案都非常常见,甚至同一个项目里,不同的开发人员都使用不同的习惯, 不过关于两者的比较不是本文关注的重点,只总结为一句话:“async 是异步编程的终极解决方案”。 当使用 async 函数的时候,很多文章都说建议用 我们先看下使用 try catch 情况下的代码示例: 示例1 :使用 try catchfunction getUserInfo () { return new Promise((resolve, reject) => { setTimeout(() => { reject('请求异常') }, 1000) }) } async function logined () { try { let userInfo = await getUserInfo() // 执行中断 let pageInfo = await getPageInfo(userInfo?.userId) } catch(e) { console.warn(e) } } logined() 执行后会在 catch 里捕获 示例2: 直接 catch鉴于正常情况下, function getUserInfo () { return new Promise((resolve, reject) => { setTimeout(() => { reject('请求异常') }, 1000) }) } async function logined () { let userInfo = await getUserInfo().catch(e => console.warn(e)) // 执行没有中断,userInfo 为 undefined if (!userInfo) return // 需要做非空校验 let pageInfo = await getPageInfo(userInfo?.userId) } logined() 执行后 catch 可以正常捕获异常,但是程序没有中断,返回值 示例3:在 catch 里 reject可以继续优化,在 catch 里面加一行 完整代码: function getUserInfo () { return new Promise((resolve, reject) => { setTimeout(() => { reject('请求异常') }, 1000) }) } async function logined () { let userInfo = await getUserInfo().catch(e => { console.warn(e) return Promise.reject(e) // 会导致控制台出现 uncaught (in promise) 报错信息 }) // 执行中断 let pageInfo = await getPageInfo(userInfo?.userId) } logined() 一般我们在项目里都是用 axios 或者 fetch 之类发送请求,会对其进行一个封装,也可以在里面进行 catch 操作,对错误信息先一步处理,至于是否需要 reject,就看你是否想要在 await 命令异常时候中断了;不使用 reject 则不会中断,但是需要每个接口拿到 response 后先 非空校验, 使用 reject 则会在异常处中断,并且会在控制台暴露 建议不需要在 await 处异常时中断,可以这样写,需要做非空校验,控制台不会有报错信息 let userInfo = await getUserInfo().catch(e => console.warn(e)) if (!userInfo) return 需要在 await 处异常时中断,并且在意控制台报错,可以这样写 try { let userInfo = await getUserInfo() // 执行中断 let pageInfo = await getPageInfo(userInfo?.userId) } catch(e) { console.warn(e) } 需要在 await 处异常时中断,但是不在意控制台报错,则可以这样写 let userInfo = await getUserInfo().catch(e => { console.warn(e) return Promise.reject(e) // 会导致控制台出现 uncaught (in promise) 报错信息 }) // 执行中断 let pageInfo = await getPageInfo(userInfo?.userId) 总结几种写法,初看可能觉得第三种 catch 这种写法是最好的,但是细想下,从用户体验上来看,我觉得 try catch 是最好的,逻辑直观、符合同步编程思维,控制台不会暴露 而链式调用的 catch (里面再 reject),是传统 promise 的回调写法,既然已经用 async await 这种同步编程写法了,再用 catch 链式写法,感觉没必要。 该文章在 2023/7/24 17:17:44 编辑过 |
关键字查询
相关文章
正在查询... |