无法读取属性"长度"未定义?

时间:2017-08-23 11:25:23

标签: javascript node.js

我正试图为我所在的小社区创造一些东西。但我还不熟悉JavaScript和NodeJS。我正在编写的脚本应该首先找到6个组中用户列表的所有可能组合。

然后我需要将这些组中的每一组技能等级平均,然后进行比较,以便找到与最接近的两个匹配的两个组。通过这种方式,我们可以让两支球队相互对抗,至少在某种程度上保持平衡。

但我的第一个问题是,我似乎无法打印出我正在制作的阵列中的任何内容,而且我不明白为什么。

var filePath = 'data.txt';

function readFile() {
    var data = [];
    var lineReader = require('readline').createInterface({
        input: require('fs').createReadStream(filePath)
    });
    lineReader.on('line', function(line) {
        var splitString = line.split(',');
        var arr = { 
            sr: splitString[0],
            role: splitString[1],
            discord: splitString[3]
        };
        data.push(arr);
        console.log(arr);
    });

    lineReader.on('close', () => {
        return data;
    });
}

function balance() {
    var data = readFile();
    for(var i = 0; i < data.length; i++) {
        console.log(data[i]);
    }
}

balance();

输出始终未定义。我做错了什么?

2 个答案:

答案 0 :(得分:2)

你能做的不是改变阅读功能的本质,而是改变你的方法。

我会给你两个选择。

使用回调:

var filePath = 'data.txt';

function readFile(callback) {
    var data = [];
    var lineReader = require('readline').createInterface({
        input: require('fs').createReadStream(filePath)
    });
    lineReader.on('line', function (line) {
        var splitString = line.split(',');
        var arr = {
            sr: splitString[0],
            role: splitString[1],
            discord: splitString[3]
        };
        data.push(arr);
        console.log(arr);
    });
    lineReader.on('close', () => {
        callback(data);
    });
}

function balance() {
    readFile(function (data) {
        for (var i = 0; i < data.length; i++) {
            console.log(data[i]);
        }
    });
}

balance();

使用承诺:

var filePath = 'data.txt';

function readFile() {
    return new Promise(function (resolve, reject) {
        var data = [];
        var lineReader = require('readline').createInterface({
            input: require('fs').createReadStream(filePath)
        });
        lineReader.on('line', function (line) {
            var splitString = line.split(',');
            var arr = {
                sr: splitString[0],
                role: splitString[1],
                discord: splitString[3]
            };
            data.push(arr);
            console.log(arr);
        });
        lineReader.on('close', () => {
            resolve(data);
        });
    });
}

function balance() {
    readFile().then(function (data) {
        for (var i = 0; i < data.length; i++) {
            console.log(data[i]);
        }
    }, function (error) {

    });
}

balance();

答案 1 :(得分:1)

使用async等待

const filePath = './data.txt';

async function readFile() {
  return new Promise((resolve) => {
    const data = [];
    const lineReader = require('readline').createInterface({
      input: require('fs').createReadStream(filePath),
    });

    lineReader.on('line', (line) => {
      const [sr, role, discord] = line.split(',');
      const arr = {
        sr,
        role,
        discord,
      };
      data.push(arr);
    });

    lineReader.on('close', () => {
      resolve(data);
    });
  });
}

async function balance() {
  const data = await readFile();
  for (let i = 0; i < data.length; i += 1) {
    console.log(data[i]);
  }

  return 1;
}

balance().then(() => { });

使用观察者模式

const { EventEmitter } = require('events');
const fs = require('fs');

class FileParser extends EventEmitter {
  constructor(file) {
    super();
    this.file = file;
  }

  parse() {
    const self = this;
    const data = [];
    const lineReader = require('readline').createInterface({
      input: require('fs').createReadStream(self.file),
    });

    lineReader.on('line', (line) => {
      const [sr, role, discord] = line.split(',');
      const arr = {
        sr,
        role,
        discord,
      };
      data.push(arr);
    });

    lineReader.on('close', () => {
      self.emit('done', data);
    });

    return this;
  }
}

const fileParser = new FileParser('./data.txt');
fileParser
  .parse()
  .on('done', (data) => {
    for (let i = 0; i < data.length; i += 1) {
      console.log(data[i]);
    }
  });

重构一下以使用最新的ES6语法;