[英]How to refer and assign to a global variable inside an anonymous function?
我正在讀取 json 文件並將 json 分配給全局變量,但它似乎不起作用,因為全局變量仍未定義。
var libObj;
fs.readFile('library.json', 'utf8', function(err, data) {
if (err){
console.log(err);
} else {
libObj = JSON.parse(data);
}
});
這是因為回調是非阻塞和異步的,並且在未來某個不確定的時間被調用,並且不會從上到下順序執行。
如果您添加額外的日志記錄,您可以看到會發生什么:
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");
這將產生這個 output:
before
after
callback called
your data here
因此,您可以看到分配工作正常,它只是在您嘗試使用變量之后發生。
解決這個問題的常用方法是在回調中使用fs.readFile()
的結果,或者從該回調中調用一些 function。
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
這是異步代碼執行的典型問題。 您的示例代碼不會從上到下執行。 特別是,您的匿名 function 不會被執行。 您需要了解全局上下文概念。 要解決您需要執行所有屬於 readFile function 的代碼的問題,它里面的所有回調都是這樣的:
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 function 上下文框之外創建一個 function 並在需要時調用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.