如何给async await批量添加try…catch?

news2025/1/12 21:56:00

如何给async await批量添加try…catch?

    • async和await是什么?
    • 如何给async await批量添加try…catch
      • babel插件的实现思路
      • 插件的基本格式示例
      • 寻找await节点
      • 向上查找 async 函数
      • 添加用户选项
    • babel插件的安装使用
    • 其他参考资料

async和await是什么?

​ 在前端开发的工作过程中,async和await想必大家都很熟悉,只要发请求或者是基于promise的异步操作,都可以用promise的终极解决方案来操作,这样写可以使代码变得简介,并且在看代码的时候可以按照同步的代码去书写,(仅仅看上去是同步的,本质还是异步的

try…catch是什么东西?那么为什么要用try…catch呢?它的存在是为了解决什么问题的?

带着上边的三个问题我们来一一解答,try…catch是什么呢?举个例子,在生活中我们难免会犯错,当我们知道有些错误不可避免或者可能会出错的时候,我们会先去想好如果犯了错,应该怎么解决这个错误,那么try…catch也是如此,它是为了解决我们在书写代码的过程中可能会出错的地方,用try…catch包裹起来,如果这段代码成功的话,它是不会去执行catch里的代码的,相反,如果失败,它是不会去执行try里的代码的,当然我们有时候会不管这段代码成功或者失败,都要执行一些相应的操作,那么,就可以将代码写到finally里面,这样的话,无论这段代码成功或者失败,都会去执行这段代码,类似于promise当中的.then、.catch和.finally,而我们利用async和await去发送请求时就可以利用try和catch去包裹一下,以防出错时候用户不知道是什么问题

如何给async await批量添加try…catch

​ 如果我们每次写一个请求,手动给请求添加一个try…catch,这样肯定是可以的,总所周知,程序员都是比较懒的,能少写一个单词绝不多写一个字母,那么如何给async和await批量添加try…catch呢?

​ 带着这个问题,我打开了百度,打算面向百度编程,最后是在掘金上边找到了一个利用babel来解决的方案,在此做一个记录,希望可以帮到更多的人~~~~

babel插件的实现思路

1)借助AST抽象语法树,遍历查找代码中的await关键字

2)找到await节点后,从父路径中查找声明的async函数,获取该函数的body(函数中包含的代码)

3)创建try/catch语句,将原来async的body放入其中

4)最后将async的body替换成创建的try/catch语句

插件的基本格式示例

module.exports = function (babel) {
   let t = babel.type
   return { 
     visitor: {
       // 设置需要范围的节点类型
       CallExression: (path, state) => { 
         do soming ……
       }
     }
   }
 }

1)通过 babel 拿到 types 对象,操作 AST 节点,比如创建、校验、转变等

2)visitor:定义了一个访问者,可以设置需要访问的节点类型,当访问到目标节点后,做相应的处理来实现插件的功能

寻找await节点

回到业务需求,现在需要找到await节点,可以通过AwaitExpression表达式获取

module.exports = function (babel) {
   let t = babel.type
   return { 
     visitor: {
       // 设置AwaitExpression
       AwaitExpression(path) {
         // 获取当前的await节点
         let node = path.node;
       }
     }
   }
 }

向上查找 async 函数

通过findParent方法,在父节点中搜寻 async 节点

// async节点的属性为true
const asyncPath = path.findParent(p => p.node.async)

这里要注意,async 函数分为4种情况:函数声明 、箭头函数 、函数表达式 、函数为对象的方法

// 1:函数声明
async function fn() {
  await f()
}

// 2:函数表达式
const fn = async function () {
  await f()
};

// 3:箭头函数
const fn = async () => {
  await f()
};

// 4:async函数定义在对象中
const obj = {
  async fn() {
      await f()
  }
}

需要对这几种情况进行分别判断

module.exports = function (babel) {
   let t = babel.type
   return { 
     visitor: {
       // 设置AwaitExpression
       AwaitExpression(path) {
         // 获取当前的await节点
         let node = path.node;
         // 查找async函数的节点
         const asyncPath = path.findParent((p) => p.node.async && (p.isFunctionDeclaration() || p.isArrowFunctionExpression() || p.isFunctionExpression() || p.isObjectMethod()));
       }
     }
   }
 }

添加用户选项

用户引入插件时,可以设置excludeincludecustomLog选项

exclude: 设置需要排除的文件,不对该文件进行处理

include: 设置需要处理的文件,只对该文件进行处理

customLog: 用户自定义的打印信息

babel插件的安装使用

npm网站搜索babel-plugin-await-add-trycatch
在这里插入图片描述

有兴趣的朋友可以下载玩一玩

babel插件的安装使用

最终的代码可以参考这位大佬的github仓库

其他参考资料

Babel 插件手册

嘿,不要给 async 函数写那么多 try/catch 了

原文地址:

阿里面试官:如何给所有的async函数添加try/catch?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深紫色粉末BHQ-1 NHS,916753-61-2,NHS修饰是合成后与一个伯氨基的共轭

英文名称:BHQ-1 NHS CAS:916753-61-2 外观:深紫色粉末 分子式:C30H31N7O7 分子量:601.62 储存条件:-20C,避光避湿 结构式: 凯新生物产品简介: NHS修饰是合成后与一…

程序员必知必会网络传输之TCP/IP协议族,共864页的详解文档让你原地起飞!

我们现实网络无处不在,我们被庞大的虚拟网络包围,但我们却对它是怎样把我们的信息传递并实现通信的,我们并没有了解过,那么当我们在浏览器中出入一段地址,按下回车这背后都会发生什么? 比如说一般场景下&a…

ubuntu18.04安装QT5

ubuntu18.04安装QT5 1、说明 QT界面本不应该做为一个很高的知识点,问题是,越来越多的程序实验,需要界面支持,或用界面显得更加方便,因而专门启动该栏目专门介绍QT方法。因为体系比较庞大,因此,需…

在腾讯云 TKE 上部署 EMQX MQTT 服务器集群

云进入以「应用为中心」的云原生阶段,Operator 模式的出现,为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范。针对大规模分布式物联网 MQTT 消息服务器 EMQX 全生命期管理的自动化管理工具 EMQX Kubernetes Operator&#xff0…

11.数组的分类和定义

1.数组的概念 数组是若干个相同类型 的变量在内存中有序存储的集合。 int a[10];//定义了一个整型的数组a,a是数组的名字,数组中有10个元素,每个元素的类型都是int类型,而且在内存中连续存储。 这十个元素分别是a[0] , a[1] , … …

[附源码]java毕业设计鲜花销售管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

同花顺_代码解析_技术指标_Z_2

本文通过对同花顺中现成代码进行解析,用以了解同花顺相关策略设计的思想 目录 ZNZ_CYC ZNZ_CYD ZNZ_CYDD ZNZ_CYDK ZNZ_CYE1 ZNZ_CYF1 ZNZ_CYMR ZNZ_CYOBV ZNZ_CYQKL ZNZ_CYQKR ZNZ_CYR ZNZ_CYS ZNZ_DKBL ZNZ_CYC 指南针成本均线 技术分析非常重视成…

【PinkCAx】可视化工具开发记录与总结

-----------PinkCAx----------- 仅以此篇,记录我的一次可视化软件开发尝试点滴。 简介 PinkCAx是一款采用Python语言编写的,基于QT5VTK架构的三维可视化工具。 该工具目前的功能如下: 基本操作 网格文件的打开与保存(支持STL、P…

Packet Tracer - 确定 DR 和 BDR

地址分配表 设备 接口 IP 地址 子网掩码 RA G0/0 192.168.1.1 255.255.255.0 Lo0 192.168.31.11 255.255.255.255 RB G0/0 192.168.1.2 255.255.255.0 Lo0 192.168.31.22 255.255.255.255 RC G0/0 192.168.1.3 255.255.255.0 Lo0 192.168.31.33 255.25…

sqli-labs/Less-38

这一关有变成了get请求的题目了 我们先判断一下是否属于数字型注入 输入如下 id1 and 12 回显如下 属于字符型 然后判断一下是单引还是双引 输入1 报错了 从报错信息可知 这是一个单引号注入型 我们去佐证一下呗 输入1-- 回显如下 可以 确实是单引号注入型 然后我选择使用…

SeriLog日志框架的应用

C#中当前流行的日志框架有NLog、Log4Net、及SeriLog,在这里我们简单介绍SeriLog日志框架的应用 1、日志基础 (1)、日志等级 (2)、日志接收器 序号 接收器 说明 1 Console 输出到控制台 2 Debug 输出到VS的Debug窗口 3…

TCP沾包问题

TCP流式协议:所谓流式协议,即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标志,需要我们人为地去给这些协议划分边界。 我们说 TCP 是流式协议究竟意味着什么? - 云社区 - 腾讯云 (tencent.com) 网…

DJ12-1 8086系列指令系统-1

指令:能够被计算机识别并执行的二进制代码。 指令系统:所有指令的集合。 指令按功能分类:数据传送类、算术运算类、逻辑运算和移位、串操作、控制转移类、处理器控制。 一、8086 指令格式 1. 指令的一般格式 在《计组》里面,我…

计算机网络——第六章笔记(2)

TCP 连接的建立 三次握手建立连接: 1、一方(server)被动地等待一个进来的连接请求 2、另一方(the client)通过发送连接请求,设置一些参数 3、服务器方回发确认应答 4、应答到达请求方,请求方最…

[Spring Cloud] Hystrix三大特性--降级,熔断,隔离

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

高级测试工程师必备技术:用Git版本控制自动化测试代码

初识Git版本控制 自动化测试代码反复执行,如果借用持续集成工具会提高测试效率,那么需要我们把自动化测试代码发布到正式环境中,这时候用Git版本控制工具高效、稳定、便捷。 分布式版本控制 Git可以把代码仓库完整地镜像下来,有…

Mybatis整合MP

Mybatis整合MP 案例准备: 创建测试表: -- 创建测试表 CREATE TABLE tb_user (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,user_name varchar(20) NOT NULL COMMENT 用户名,password varchar(20) NOT NULL COMMENT 密码,name varchar(30) …

kafka性能指南

kafka性能指南 1.绪论 首先是epoll模型,epoll使其在框架上得以使用mmp和回写高性能。 epoll模型具体可以看linuxIO那一个笔记,这里简单讲一下 首先是epoll模型,模型要求有一组fd由单独线程监控,然后app去干别的事,当…

Arduino开发实例-MAX30100 脉搏血氧仪传感器驱动

MAX30100 脉搏血氧仪传感器驱动 1、MAX30100介绍 MAX30100 脉搏血氧仪和心率传感器是一款基于 I2C 的低功耗即插即用生物识别传感器。 MAX30100 是一款集成脉搏血氧饱和度和心率监测传感器解决方案。 它结合了两个 LED、一个光电探测器、优化的光学器件和低噪声模拟信号处理,…

【蓝桥杯Web】第十四届蓝桥杯(Web 应用开发)模拟赛 2 期 | 精品题解

🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 🖥️ 蓝桥杯专栏:蓝桥杯题解/感悟 🖥️ TS知识总结:十万字TS知识点总结 👉 你的一键三连是我更新的最大动力❤️! &…