最近网上突然多了好多 给所有的async函数添加try/catch 的面试题,实现思路基本就是用 babel
正好最近也在学习 GoGoCode
,就想到用 GoGoCode
实现一下
GoGoCode 是一个基于 AST 的 JavaScript/Typescript/HTML 代码转换工具,但相较于同类,它提供了更符合直觉的 API:一套类 JQuery 的 API 用来查找和处理 AST、一套和正则表达式接近的语法用来匹配和替换代码
🌈 Demo
import $ from 'gogocode'
function transform(source) {
const addTry = (str) => `{try ${str} catch(e) {console.log('报错了', e)}}`
const set = new Set
return $(source)
.find('await $_$')
.each(item => {
// 向上查找 async函数 或 try语句
item = item = Array.from(item.parents()).map(e => e.nodePath).find(e => e.node?.async || e.node?.type == 'TryStatement')
// 没有找到 async函数 或 已存在 try语句 则不做处理
if (!item?.node.async) return
if (set.has(item.node)) return
set.add(item.node)
// 给函数体添加 try语句
item.node.body = addTry($(item.node.body).generate())
})
.root()
.generate()
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。