如何修复这个javascript程序?

时间:2016-12-13 16:31:39

标签: javascript node.js

我的代码如下:

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]);
 ....

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