2016-03-11 2 views
0

У меня есть список файлов. Мне интересно узнать их имена и количество строк, которые они содержат. Я знаю, что есть более простые способы сделать это, но есть ли способ сделать это, используя общую структуру кода ниже?Асинхронное чтение файлов в js

var fs = require('fs'); 

var fileList = ['./newtest.js', './globtime.js', './newtest.js']; 

var numLines = 0; 
var filesCount = 0; 

function returnLines() { 
    console.log('the length of all files is ' + numLines); 
} 

function readLines(files) { 
    for (file in files) { 
     fs.readFile(files[file], function(err, data) { 
      if (data != undefined) { 
       var array = data.toString().split("\n"); 
       numLines += array.length; 
       filesCount +=1; 
       console.log('the length of ' + files[file] + ' is ' + array.length); // get this to work .. 
       if (filesCount == files.length) { 
        returnLines(); 
       } 
      } 
     }); 
    } 
} 

readLines(fileList); 
+0

Что такое «более простые способы» и то, что о «общего структуру кода "хотели бы вы сохранить в пользу более простых способов? – djechlin

ответ

2

Вы можете сделать это с крышкой:

var fs = require('fs'); 

var fileList = ['./newtest.js', './globtime.js', './newtest.js']; 

var numLines = 0; 
var filesCount = 0; 

function returnLines() { 
    console.log('the length of all files is ' + numLines); 
} 

function readLines(files) { 

    var readFile = function(name){ 
    return fs.readFile(name, function(err, data) { 
     if (data != undefined) { 
     var array = data.toString().split("\n"); 
     numLines += array.length; 
     filesCount +=1; 
     console.log('the length of ' + name + ' is ' + array.length); // get this to work .. 
     if (filesCount == files.length) { 
      returnLines(); 
     } 
     } 
    }); 
    }; 

    for (file in files) { 
    readFile(files[file]);  
    } 
} 

readLines(fileList); 
1

Позвольте мне переписать исходный пример обещаниями:

var Promise = require('bluebird');  
var fileList = ['./newtest.js', './globtime.js', './newtest.js']; 

readLines(fileList).then(function(returnLines) { 
    var numLines = 0; 

    returnLines.forEach(function(res) { 
    console.log('the length of ' + res.name + ' is ' + res.numLines); 
    numLines += res.numLines; 
    }); 

    console.log('the length of all files is ' + numLines);  
}); 

function readLines(files) {  
    var promises = []; 
    var result = []; 
    var readFile = Promise.promisify(require('fs').readFile); 

    for(i in files) { 
    promises.push(readFile(files[i]) 
      .bind({ index: i }) 
      .then(function(data) { 
       result[this.index] = { 
       name: files[this.index], 
       numLines: data.toString().split('\n').length 
       }; 
      }) 
    ) 
    } 

    return Promise.all(promises).then(function() { 
    return result; 
    });  
} 
Смежные вопросы