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