当前位置: 首页 > news >正文

佳木斯企业网站建设/seo课程培训班费用

佳木斯企业网站建设,seo课程培训班费用,旅游景点网站设计方案,建国汽车网址大全前言 写异步函数的时候,promise 和 async 两种方案都非常常见,甚至同一个项目里,不同的开发人员都使用不同的习惯, 不过关于两者的比较不是本文关注的重点,只总结为一句话:“async 是异步编程的终极解决方案”。 当使…

前言

写异步函数的时候,promise 和 async 两种方案都非常常见,甚至同一个项目里,不同的开发人员都使用不同的习惯, 不过关于两者的比较不是本文关注的重点,只总结为一句话:“async 是异步编程的终极解决方案”。
当使用 async 函数的时候,很多文章都说建议用 try catch 来捕获异常, 可是实际上我看了很多项目的代码,遵循的并不是严谨,很多都没有用,甚至 catch 函数都没写,这是为什么呢?
我们先看下使用 try catch 情况下的代码示例:

示例1 :使用 try catch

function 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 里捕获 请求异常,然后 getUserInfo 函数中断执行,这是符合逻辑的,对于有依赖关系的接口,中断执行可以避免程序崩溃,这里唯一的问题是 try catch 貌似占据了太多行数,如果每个接口都写的话看起来略显冗余。

示例2:直接 catch

鉴于正常情况下,await 命令后面是一个 Promise 对象, 所以上面代码可以很自然的想到优化方案:

function getUserInfo () {return new Promise((resolve, reject) => {setTimeout(() => {reject('请求异常')}, 1000)})
}async function logined () {let userInfo = await getUserInfo().catch(e => console.warn(e))// 执行没有中断,userInfo 为 undefinedif (!userInfo) return // 需要做非空校验let pageInfo = await getPageInfo(userInfo?.userId)
}logined()

执行后 catch 可以正常捕获异常,但是程序没有中断,返回值 userInfo 为 undefined, 所以如果这样写的话,就需要对返回值进行非空校验, if (!userInfo) return 我觉得这样有点反逻辑,异常时就应该中断执行才对;

示例3:在 catch 里 reject

可以继续优化,在 catch 里面加一行 return Promise.reject(e), 可以使 await 中断执行;
完整代码:

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 则会在异常处中断,并且会在控制台暴露 uncaught (in promise) 报错信息。
图片

建议

不需要在 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 是最好的,逻辑直观、符合同步编程思维,控制台不会暴露 uncaught (in promise) 报错信息;
而链式调用的 catch (里面再 reject),是传统 promise 的回调写法,既然已经用 async await 这种同步编程写法了,再用 catch 链式写法,感觉没必要。

http://www.jmfq.cn/news/5319613.html

相关文章:

  • 怎么样建设企业网站/短视频seo公司
  • 企业门户网站建设信息/百家号权重查询
  • 牡丹江建设行业协会网站/全国新冠疫情最新消息
  • 电子商务网站建设方案推荐/俄罗斯网络攻击数量增长了80%
  • 成都龙泉建设网站/爱站网seo综合查询
  • 湖北强涛建设工程有限公司网站/淘宝排名查询
  • 端州网站建设公司/软文推广网站
  • 建设网站怎么做/网站广告策划
  • 深圳建设网站/广州百度网站快速排名
  • 广东万泰建设有限公司网站/百度重庆营销中心
  • 网站建设推广seo/如何建立自己的网站平台
  • 襄阳市作风建设年 网站/网站seo关键词排名查询
  • 建设银行沈阳分行网站/中国seo谁最厉害
  • dw建设的网站怎么看/sem论坛
  • 建设网站有哪些方法/seo做的比较牛的公司
  • 常州医院网站建设/磁力
  • 厦门网站建设哪家厦门建设银行/seo是指
  • 天津市住房与建设管理委员会网站/百度地图官网2022最新版下载
  • 网站建设有什么好处/深圳网络推广服务公司
  • 贵州省交通建设集团网站/新闻今日头条最新消息
  • 奔奔网站建设/疫情最新官方消息
  • 网站建设 公司 广州/福州seo兼职
  • 昆山网站建设培训/深圳网络推广怎么做
  • 官方网站建设 安全还踏实磐石网络/88个seo网站优化基础知识点
  • 网站建设培训珠海/历史权重查询
  • 广州知名网站建设网页设计服务/游戏加盟
  • 北京市建设资格与执业资格注册中心网站/seo的概念
  • 网站建设管理风险/深圳市网络营销推广服务公司
  • 长春星宿网站建设公司怎么样/在百度上怎么注册网站
  • 对电子商务网站建设与管理的心得/常州网站推广公司