我有一个包含大量文件的字典,每个文件中的文本都是整数。 我想异步查看所有文件并找到最大数量。
最好的方法是什么?
此代码是同步的:
"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);
}
});
});
});
答案 0 :(得分:1)
从广泛使用的解决方案 - async包开始。它为你完成了大部分工作。
这里有一些异步的教程:
https://github.com/justinklemm/nodejs-async-tutorial
因此,如果您确实拥有大量文件,则可以使用async.each
或async.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);
});