关于dataviewjs中异步编程的问题

这是我的dataviewjs程序,修改自 Bon:Obsidian 插件之 Dataview - 知乎

function countTimes(term){
dv.header(2, term)
const files = app.vault.getMarkdownFiles()

// 将带有标签的文件以及行筛选出来
let arr = files.map( async(file) => {
//turn all the content into an array
  const content = await app.vault.cachedRead(file)
  let lines = await content.split("\n").filter(line => line.includes(term))
    return ["[["+file.name.split(".")[0]+"]]", lines]
})

// 生成表格,如果要将当前的文件排除的话,请修改其中的排除文件
Promise.all(arr).then(values => {
	const exists = values.filter(value => value[1][0] && value[0] != "[[測試dataview]]")
	//dv.table(["file", "lines"], exists)
	for(var i = 0 ; i < exists.length ; i++)
		dv.paragraph(exists[i][0]+" "+exists[i][1].length)
})
}

功能为输出所有带有标签的文件链接以及对应行数目
countTimes(“ABC”)
单独执行没问题,但如果执行两个,输出内容会混在一起
countTimes(“ABC”)
countTimes(“DEF”)
要如何让第一个函数结束再执行第二个呢