在一个简单的程序中实现并行化流程控制

这个栗子,是将所有待处理事项放到tasks里,然后通过for循环去执行。在个函数运行结束时,添加一个计数,并与tasks的长度进行比较,从而判断是否完成。

打印tasks,会是一个函数集合[[Function],[Function],[Function]]

var fs = require('fs')
var completedTasks = 0
var tasks = []
var wordCounts = {}
var fileDir = './text'

function checkIfComplets() {
    completedTasks ++
    if(completedTasks == tasks.length){
        for( var index in wordCounts){
            console.log(index + ': ' + wordCounts[index])
        }
    }
}
function countWordsInText(text) {
    var 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(var index in files){
        var task = (function (file) {
            return function () {
                fs.readFile(file, function (err, text) {
                    if(err) throw  err
                    countWordsInText(text)
                    checkIfComplets()
                })
            }
        })(fileDir + '/' + files[index])
        tasks.push(task)  }
    for(var task in tasks){
        tasks[task]()
    }
})

随机浏览