2017-03-08 176 views
0
loadJSON(path, callback) { 
    console.log("path: " + path); 
    var xobj = new XMLHttpRequest(); 
     xobj.overrideMimeType("application/json"); 
    xobj.open('GET', path, true); 
    xobj.onreadystatechange = function() { 
      if (xobj.readyState == 4 && xobj.status == "200") { 
      callback(xobj.responseText); 
      } 
    }; 
    xobj.send(null); 
} 

上面是一個在本地訪問json文件的函數。 然後從`foobar()'解析檢索到的數據。 但是,從回調函數的「外部」,變量「json」無法訪問。 我已經搜索了類似的SO問題和異步概念,但仍然無法找到解決問題的方法。訪問javascript中一個回調函數的「外部」變量

function foobar() { 
    var json; 
    loadJSON("data.json", function(response) { 
     json = JSON.parse(response); 
     console.log(json[0].name); // Successfully shows the result 
    }); 
    console.log(json[0].name); // TypeError: json is undefined 
} 

有沒有辦法訪問回調變量「外部」?

+0

http://stackoverflow.com/questions/14220321 /我怎麼做 - 我從一個異步調用返回響應 –

+0

[爲什麼我的變量在函數內部修改後沒有改變? - 異步代碼引用](http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) – Andreas

+0

檢查兩個鏈接現在我得到了一個更好的理解**爲什麼**它不能被稱爲'外部'的回調,現在我通過在'loadJSON()'中實現函數來解決我的問題,但是我仍然沒有得到**可以訪問它之外的變量。我想知道有一個解決方法不是爲什麼。 – HUKS

回答

2

這是因爲它設置爲異步模式。

console.log(json[0].name); // TypeError: json is undefined 

此代碼在json填充之前執行。因此,當您嘗試訪問它時,它可能仍然是空的。在此行中的第三個參數將其定義爲異步:

xobj.open('GET', path, true); 

你可以嘗試把

xobj.open('GET', path, false); 

但它不再是不同步,用戶將不得不等待請求結束,所以當回調方法已經被調用,而不是之前,確保使用'json'var可能會更好。保持異步模式。 爲此,您需要重構您的代碼。

Gerardo Furtado發佈的鏈接完全準確,您應該檢查它。

編輯:正如我已經指出,和其他用戶也是如此,異步:假的不是很好,所以我編輯我的回答:

function foobar() { 
    var json; 
    loadJSON("data.json", function(response) { 
     json = JSON.parse(response); 
     // Call another function with json that is now filled with data 
     triggered(json); 
    }); 
} 

function triggered(json) { 
    console.log(json[0].name); 
    // Do your work on json 
} 
+0

接受爲答案,因爲它實際上解決了我的問題。 – HUKS

+0

@HUKS'async:false'幾乎總是**不是**答案......您應該仔細看看「Possible duplicate:...」鏈接,以瞭解問題的核心以及如何解決 – Andreas

+0

我接受這個答案的原因是,我的目標是一個脫機運行的腳本,使用瀏覽器就像用戶界面一樣,所以我想我不必擔心服務器響應問題。我同意這可能不是大多數異步情況下的答案。 – HUKS

1

這很簡單。在函數之外聲明json變量。這給變量一個全局範圍。調用該函數只是爲了覆蓋json,而json可以在腳本中的任何地方使用

相關問題