動態

詳情 返回 返回

GoGoCode 20行代碼實現 給所有的async函數添加try/catch - 動態 詳情

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

Add a new 評論

Some HTML is okay.