最近网上突然多了好多 给所有的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()
}

灬都是个谜
38 声望4 粉丝