繁体   English   中英

无法读取未定义的属性“长度”?

[英]Cannot read property “length” of undefined?

我正在尝试为自己所在的一个小社区做点事情。但是我对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();

输出始终是未定义的。 我究竟做错了什么?

您所能做的就是不改变阅读功能的性质,而是改变您的方法。

我会给你两个选择。

使用回调:

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();

使用异步等待

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语法;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM