亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JS:加載的 json 未定義,即使它不是

JS:加載的 json 未定義,即使它不是

達令說 2023-08-18 14:01:31
我正在嘗試通過 json 加載一個數組,這個函數主要是從 W3 學校偷來的:function load_json_data(path, callback) {  var httpRequest = new XMLHttpRequest();  httpRequest.onreadystatechange = function() {    if (httpRequest.readyState === 4 && httpRequest.status === 200) {      var data = JSON.parse(httpRequest.responseText);      if (callback) callback(data);    }  };  httpRequest.open('GET', path);  httpRequest.send();}我有第二個函數應該繪制數據圖表,但讓我們假設它只是打印數組。(它也不會繪制它們的圖表,因此這不僅僅是顯示錯誤):function create_graph(data) {    console.log(data);}現在,在任何功能之外,我正在這樣做:var data;load_json_data(  "./test.json",  function(return_data) {    data = return_data;  });console.log("Loaded Data: " + data)create_graph(data);所以我加載“./test.json”并將其傳遞給函數。不幸的是,輸出顯示數據未定義,但是當我手動訪問變量時,我得到了正確的輸出:Loaded Data: undefinedReceived Data: undefined> data(6) [0.6, 0.55, 0.45, 0.4, 0.7, 0.66]我來自 c 和 python,所以我假設解釋器對我隱藏了一些東西。為什么在加載函數運行后變量未定義,但在訪問它時已定義?
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

當你提供一個 set 的回調時data,你基本上是在告訴 JS“發出 HTTP 請求,data完成后設置變量,但同時繼續運行后面的代碼?!?如果要data設置,則必須將使用的代碼data移至回調中:


var data;

load_json_data(

? "./test.json",

? function(return_data) {

? ? data = return_data;

? ? console.log("Loaded Data: " + data)

? ? create_graph(data);

? }

);

您還應該考慮遷移到fetch API以及使用Promise:

function load_json_data(path, callback) {

? return fetch(path).then(res => res.json());

}


load_json_data("./test.json", function(data) {

? console.log("Loaded data: " + data);

? create_graph(data);

});


查看完整回答
反對 回復 2023-08-18
  • 1 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號