2016-12-13 10 views
-2

Мой код выглядит следующим образом:Как исправить эту программу javascript?

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 

См Data_array используется в если заявление. Я думаю, что массив ничего не получил, поэтому он не печатает ничего, кроме неопределенного, а его длина равна 0.

Как я могу применять это выполнить шаг за шагом эти строки в письменном порядке

var data_array = []; 
readData('file.txt'); 
console.log(data_array[0]); 
console.log(data_array[1]); 
.... 
+1

Вашей 'Функция readData' сохраняет в локальном переменный, а не глобальный - это консольное ведение журнала. – Jecoms

+1

data_array - пустой массив и никогда не изменяется. что вы ожидали? – manonthemat

+0

@Jecoms, я понял, что теперь, thx – arslan

ответ

3

Ваш код не работает, потому что вы создаете локальную переменную области и она становится глобальной. Чтобы исправить, замените var data_array = array... на data_array = array....

Кроме того, имейте в виду, что вы используете несколько antipatterns:

Во-первых, не проверять существование файла перед чтением - потому, что это возможно для кого-то, чтобы удалить файл между чеках. Вместо этого просто прочитайте его и обработайте исключение.

Во-вторых, прочитайте файл с 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]); 
})(); 
+0

или лучше вернуть data_array и назначить его – xszaboj

+0

Спасибо, моя ошибка, использовал var в декларации и позже снова перед массивом данных. lol ... – arslan

+0

Я пробовал ваш код, но сообщалось об ошибке. пытаясь исправить его сейчас – arslan

Смежные вопросы