如何在匿名函数中引用并分配给全局变量?

时间:2019-09-24 13:08:36

标签: javascript node.js electron

我正在从json文件读取并将json分配给全局变量,但由于全局变量仍未定义,它似乎无法正常工作。

var libObj;

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

2 个答案:

答案 0 :(得分:0)

这是因为回调是非阻塞且异步的,并且在将来会被称为不确定的时间,并且不会从上到下依次执行。

如果添加额外的日志记录,则可以看到发生的情况:

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

答案 1 :(得分:0)

这是异步代码执行中的典型问题。您的示例代码不会从上到下执行。特别是,您的匿名函数不会被执行。 您需要了解全局上下文概念。 修复您需要执行所有属于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函数上下文框外创建一个函数,并在需要时调用它