Javascript fs.readfile () не сохраняется в переменную - PullRequest
2 голосов
/ 20 июня 2020

Я пытаюсь использовать javascrtipt fs.readfile(), но не могу заставить его сохранить то, что он прочитал в переменной. Вот мой код:

const fs = require('fs')

var importantFinalCode = "waiting..."

fs.readFile("\pvMLTest.txt", "utf8", 
function(err, data){
  importantFinalCode = JSON.parse(data)
})


do {
  console.log("...")
} while (importantFinalCode == "waiting...")

console.log(importantFinalCode)

По какой-то причине он просто бесконечно регистрирует ..., хотя функция говорит, что нужно установить переменную importantFinalCode на то, что она читает. Мне нужно сделать его глобальной переменной? Если да, то как?

Кстати, вот файл, который он читает (pvMLTest.txt):

[["1", "2", "3"], ["3", "2", "4"]]

Спасибо.

Ответы [ 3 ]

3 голосов
/ 20 июня 2020

Следующий код представляет собой бесконечный l oop, который занимает все событие l oop - поэтому ваш скрипт никогда не завершается:

do {
  console.log("...")
} while (importantFinalCode == "waiting...")

Вы можете поместить консоль в fs.readFile callback для выполнения после завершения чтения файла:

const fs = require('fs')

var importantFinalCode = "waiting..."

fs.readFile("pvMLTest.txt", "utf8", 
function(err, data){
  importantFinalCode = JSON.parse(data)
  console.log(importantFinalCode)
})

Если ваш файл действительно большой, и вы хотите видеть прогресс его загрузки, вы можете использовать потоки для его чтения:

const fs = require('fs');
const sourceFile = 'pvMLTest.txt';

var importantFinalCode = "waiting...";
console.log(importantFinalCode);

var data = '';
const readStream = fs.createReadStream(sourceFile);

readStream.on('data', function(buffer) {
    console.log('...');
    data += buffer;
});
readStream.on('end', function() {
    importantFinalCode = JSON.parse(data)
    console.log(importantFinalCode);
});
0 голосов
/ 20 июня 2020

Исправлена ​​ваша проблема. Это выполняло бесконечное l oop из-за объема функции обратного вызова в fs.readFile. После того, как вы добавили данные вашего txt-файла в переменную в функции readFile, они принадлежали этой функции.

do / while l oop обращался к вашей глобально назначенной переменной, а не к переменной внутри функции.

Перемещение l oop в функцию обратного вызова исправило проблему. Но не уверен, зачем вам let importantFinalCode = "waiting...", потому что как только функция readFile запускается, она меняет значение importantFinalCode.

const fs = require('fs')

let importantFinalCode = "waiting..."

fs.readFile("\pvMLTest.txt", "utf8", function (err, data) {
    if (err) {
        console.log(err)
    }
    importantFinalCode = data

    do {
        console.log("...")
    } while (importantFinalCode === "waiting...");
    console.log(importantFinalCode)
})

Если вы хотите представить пользователю "waiting...", вы можете использовать для l oop например:

const fs = require('fs')

for (let i = 0; i <= 10; i++) {
    let importantFinalCode = "waiting..."
    console.log(importantFinalCode)
}

fs.readFile("\pvMLTest.txt", "utf8", function (err, data) {
    if (err) {
        console.log(err)
    }
    importantFinalCode = data

    console.log(importantFinalCode)
})
0 голосов
/ 20 июня 2020

Делая это:

fs.readFile("\pvMLTest.txt", "utf8", 
function(err, data){
  importantFinalCode = JSON.parse(data)
})

Вы говорите JavaScript выполнить функцию обратного вызова function(err, data){ позже. Позже означает, когда прибывают данные, а также означает, что текущий стек вызовов пуст. Таким образом:

do {
  console.log("...")
} while (importantFinalCode == "waiting...")

Вы постоянно поддерживаете текущий стек вызовов. Короче говоря, текущий стек вызовов ожидает данных, но обратный вызов данных ожидает, пока текущий стек вызовов будет пустым. Это своего рода тупик.

Что бы вы ни хотели делать с данными, оно должно go внутри обратного вызова.

Я предлагаю вам прочитать о спецификации времени выполнения JavaScript что поможет вам понять, почему ваш код не работает: https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop

...