数组没有期望值-Node.js

时间:2019-03-04 11:02:52

标签: javascript node.js asynchronous

我正在运行一个脚本,该脚本查找目录并列出文件,然后检查要处理的文件类型,如果扩展名匹配,则读取文件,并读取文件的每一行(.txt只是一个txt文件)重命名)插入到数组中。

现在,在读取文件并填充数组之后,我想使用该数组并进行一些进一步的处理,例如创建db记录。我在这里遗漏了一些非常基本的东西,因为在每个控制台日志上,我都按如下方式进行操作,总是获得所有文件内容的完整项目(在我的数组中)。

因此,使其变得更简单: 数组为空。 然后读取并处理文件,数组现在具有 array [0] =文件的第0行 array [0] =文件等的第1行

    const fs = require('fs');
const readline =require('readline');
var files = fs.readdirSync('/home/proj/data');
var path = require('path');
var model=[];
var lineReader=[];

for(var i=0; i<files.length; i++) {

    if(path.extname(files[i]) === ".col") {
       lineReader[i] = readline.createInterface({
            input: require('fs').createReadStream(files[i])
         });  

        lineReader[i].on('line', function (line) {  
          model.push(line); 
        }).on('close', async function() {
          console.log(model); 
      });

}

}

而是运行脚本,并且array []保留与扩展名匹配的所有文件的所有行。

非常感谢您的帮助,任何人都可以烤我的JS,因为我敢肯定,我在这里缺少一些基本知识。

2 个答案:

答案 0 :(得分:2)

那么,您想并行读取文件(因为这就是您的程序所做的),然后将其放入数组数组中? 您可以使读取文件机制成为一种承诺,并使用Promise.all来使用它。这是一个入门的示例。

const fs = require('fs');
const readline = require('readline');
var files = fs.readdirSync('./');
var path = require('path');

function readFile(fileName) {
    return new Promise(resolve => {
        const array = [];
        const lineReader = readline.createInterface({
            input: fs.createReadStream(files[i])
        });
        lineReader.on('line', function (line) {
            array.push(line);
        }).on('close', async function () {
            //do some proc
            console.log(array);
            resolve(array);
        });
    });
}
const readFilePromises = [];
for (var i = 0; i < files.length; i++) {
    if (path.extname(files[i]) === ".js") {
        readFilePromises.push(readFile(files[i]));
    }
}

Promise.all(readFilePromises) //or await Promise.all([..])
    .then(data => {
        console.log(data);//will be array of arrays
    })

如果您要一个Array,则可以始终使用data.flat()来平整结果

答案 1 :(得分:1)

如果文件不是很大,并且同步方法还可以,则可以通过以下方式简化代码:

'use strict';

const fs = require('fs');
const path = require('path');

const model = [];

fs.readdirSync('/home/proj/data')
  .filter(name => path.extname(name) === '.col')
  .forEach((name) => {
    model.push(...fs.readFileSync(name, 'utf8').split('\n'));
  });

console.log(model);