我的代码如下:
var data_array = [];
readData('file.txt');
console.log(data_array[0]);
console.log(data_array[1]);
console.log(data_array.length.toString());
console.log(data_array[data_array.length-1]);
//reads file into array
function readData(filepath) {
var fs = require('fs');
if (fs.existsSync(filepath)) {
var array = fs.readFileSync(filepath).toString().split("\n");
var data_array = array.slice(7,array.length - 2);
} else {
process.exit();
}
}
当我运行时,我得到了以下
undefined
undefined
0
undefined
请参阅if语句中使用的Data_array。 我认为数组没有收到任何东西,这就是为什么它只打印未定义且长度为0的原因。
如何强制执行以书面顺序逐步执行这些行
var data_array = [];
readData('file.txt');
console.log(data_array[0]);
console.log(data_array[1]);
....
答案 0 :(得分:3)
您的代码失败,因为您正在创建局部范围变量并且它会全局阴影。要解决此问题,请将var data_array = array...
替换为data_array = array...
。
另外,请记住,您使用的是几个反模式:
首先,在阅读文件之前不要检查文件是否存在 - 因为某人可能会在您的支票之间删除文件。相反,只需阅读它并处理异常。
其次,使用readFileSync(filepath, { encoding: 'utf8' })
读取文件 - 这将立即返回字符串,因此您不需要toString()
。
第三 - array.slice()
支持负面索引(它们从数组的末尾开始计算),因此您可以实际拥有array.slice(7, -2)
。
一般情况下,除非这是一次性丢弃代码,否则我建议你使用异步函数:
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
// reads file into array
const readData = Promise.coroutine(function *(filepath) {
try {
const array = (yield fs.readFileAsync(filepath, { encoding: 'utf8' })
).split("\n");
const data_array = array.slice(7, -2);
return data_array;
} catch(e) {
console.error(e);
process.exit();
}
});
Promise.coroutine(function *() {
const data_array = yield readData('file.txt');
console.log(data_array[0]);
console.log(data_array[1]);
console.log(data_array.length.toString());
console.log(data_array[data_array.length-1]);
})();