2015-10-22 102 views
0

我有一個包含大量文件的字典,每個文件中的文本都是整數。 我想要異步查看所有文件並查找最大數量。異步讀取文件 - 異步讀取所有文件並查找最大值

什麼是最好的辦法呢?

此代碼是同步:

"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

更好的怎麼樣?如果你正在尋找一個優雅的解決方案,去承諾。 – Bergi

+0

你可以試試'Q'nom – prasun

回答

0

這幾乎所有的異步的情況下使用無極答案:

"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); 
});