为了让异步任务并行执行,需要将异步函数放入数组中,任务的存放顺序无关紧要.
每个任务都应该调用处理器累积已完成的计数值.
const fs = require('fs')
let completeTasks = 0 //统计完整的异步函数计数器
let tasks = [] //要执行的异步函数
let wordCounts = {} //存储每一个异步函数的读取结果
let fileDir = './text' //目标目录
//检查是否所有并行异步函数执行完成
function checkIfComplete(){
completeTasks++
if(completeTasks == tasks.length){//表示所有的异步函数都并行执行完了
for(var index in wordCounts){ //循环打印出结果
console.log(`${index} : ${wordCounts[index]}`)
}
}
}
function countWordsInText(text){
let words = text.toString().toLowerCase().split(/\W+/).sort()
for(var index in words){
var word = words[index]
if(word){
wordCounts[word] = (wordCounts[word]) ? wordCounts[word] + 1 : 1
}
}
}
//获取目录下的文件
fs.readdir(fileDir,function(err,files){
if(err) throw err
for(let index in files){
let task = function(){
fs.readFile(`${fileDir}/${files[index]}`,(err,data)=>{
countWordsInText(data)
checkIfComplete()
})
}
tasks.push(task)
}
for(var items in tasks){
tasks[items]()
}
})