我正试图为我所在的小社区创造一些东西。但我还不熟悉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();
输出始终未定义。我做错了什么?
答案 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语法;