Как обратиться и назначить глобальную переменную внутри анонимной функции? - PullRequest
0 голосов
/ 24 сентября 2019

Я читаю из файла json и назначаю json глобальной переменной, но, похоже, она не работает, поскольку глобальная переменная остается неопределенной.

var libObj;

fs.readFile('library.json', 'utf8', function(err, data) {
    if (err){
        console.log(err);
    } else {
        libObj = JSON.parse(data);
    }
});

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

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

fs.readFile('library.json', 'utf8', function(err, data) {
 if (err){
    console.log(err);
 } else {
    libObj = JSON.parse(data);
    executeMoreCode() //for exemple
 }
});

function executeMoreCode() {
  console.log('hello');
}

, затем создать функцию вне контекстного окна функции readFile и вызывать ее, когда вы хотите

0 голосов
/ 24 сентября 2019

Это связано с тем, что обратный вызов неблокирующий и асинхронный, в будущем вызывается неопределенное время и не выполняется последовательно сверху вниз.

Если вы добавите дополнительное ведение журнала, вы увидите, что произойдет:

var libObj;

console.log("before");
fs.readFile('library.json', 'utf8', function(err, data) {
    console.log("callback called");
    if (err){
        console.log(err);
    } else {
        libObj = JSON.parse(data);
        console.log(libObj);
    }
});
console.log("after");

Это приведет к получению этого вывода:

before
after
callback called
your data here

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


Обычный способ решить эту проблему - использовать результат fs.readFile() внутри обратного вызова или вызывать какую-то функцию изнутриэтот обратный вызов.

fs.readFile('library.json', 'utf8', function(err, data) {
    if (err){
        console.log(err);
    } else {
        console.log(data);
        // use data here
        // or call a function and pass it the data here
        someFunc(data);
    }
});
// don't try to use data here, it's not available yet
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...