异步读取文件 - 异步读取所有文件并找到最大值

时间:2015-10-22 08:48:26

标签: javascript node.js

我有一个包含大量文件的字典,每个文件中的文本都是整数。 我想异步查看所有文件并找到最大数量。

最好的方法是什么?

此代码是同步的:

"use strict";
var fs = require('fs');
var dir = process.argv[2];

fs.readdir(dir, function (err, filesNames) {
    if (err) throw err;
    var max = Number.MIN_VALUE;

    filesNames.forEach(function (fileName) {
        //a synchronous function
        var file = fs.readFileSync(dir + fileName, 'utf-8');
        var num = parseInt(file);

        max = max < num ? num : max;
    });
    console.log(max);
});

但我想要一个异步功能! 我试过这个,但我确信有更好的方法可以做到。

这是我的异步功能:

"use strict";
var fs = require('fs');
var dir = process.argv[2];

fs.readdir(dir, function (err, filesNames) {
    if (err) throw err;
    var max = Number.MIN_VALUE;

    var i = 0;
    filesNames.forEach(function (fileName) {        
        //an asynchronous function
        fs.readFile(dir + fileName, 'utf-8', function (err, file) {
            if (err) throw err;

            var num = parseInt(file);
            max = max < num ? num : max;

            i++;
            if (i == filesNames.length) {
                console.log(max);
            }
        });
    });
});

2 个答案:

答案 0 :(得分:1)

从广泛使用的解决方案 - async包开始。它为你完成了大部分工作。

这里有一些异步的教程:

https://github.com/justinklemm/nodejs-async-tutorial

因此,如果您确实拥有大量文件,则可以使用async.eachasync.eachLimit

异步解决了node.js中的几乎所有异步情况

答案 1 :(得分:0)

这是使用Promise的答案:

"use strict";
var fs  = require('fs');
var dir = process.argv[2];

// make fs.readFile to work as promise
function pReadFile(file, options) {
    return new Promise((resolve, reject)=> {
        fs.readFile(file, options, (err, data) => {
            if (err) return reject(err);
            resolve(data);
        }); 
    });
}

// make fs.readdir to work as promise
function pReaddir(dir, options) {
    return new Promise((resolve, reject) => {
        fs.readdir(dir, options, (err, files) => {
            if (err) return reject(err);
            resolve(files);
        });
    });
}

pReaddir(dir).then((files)=> {
    return Promise.all(files.map((file)=> pReadFile(dir + file, 'utf-8')));
}).then((arr)=> {
    console.log(Math.max.apply(null,arr.map((elm)=>parseInt(elm))));
}).catch(function (err) {
    console.log(err);
});