我正在从json文件读取并将json分配给全局变量,但由于全局变量仍未定义,它似乎无法正常工作。
var libObj;
fs.readFile('library.json', 'utf8', function(err, data) {
if (err){
console.log(err);
} else {
libObj = JSON.parse(data);
}
});
答案 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函数上下文框外创建一个函数,并在需要时调用它