這是第二個(按照時間順序在你的代碼中)沒有被擊中。那是因爲它尚未設置。從服務器返回後,getJSON
內部的回調將異步調用。
var themeData;
// FIRST -- themeData currently null
$.getJSON("json/sample.js", function(data) {
// THIRD -- now themeData has a value, and gets logged
themeData = data.theme;
console.log(themeData.sample[0].description);
});
// SECOND -- themeData still null
console.log(themeData.sample[0].description);
如果你真的需要調用一個方法getJSON
「之後」,然後擁抱回調的想法。使用這樣的東西。
var themeData;
function myCallback(data) {
console.log(data.sample[0].description);
}
$.getJSON("json/sample.js", function(data) {
themeData = data.theme;
console.log(themeData.sample[0].description);
myCallback(themeData);
});
編輯
你也可以強制,而不是使用jQuery AJAX功能的async: false
同步調用。
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback,
async: false
});
呃,但是這個解決方案只會將範圍限制到這個特定的回調函數。我需要通過整個文檔訪問這些信息。我應該考慮一種不同的方法嗎? –
@ CarlosR.Batista看到我上面的更新 - 你可以強制它是一個同步調用,然後你的代碼將工作。儘管如此,同步呼叫還是應該謹慎使用,因爲它們會在等待服務器時阻塞客戶端腳本。 – McGarnagle
以及事情是,即時消息只是拉這個JSON文件一次,而客戶端將花費大約30分鐘在同一頁面(它的一個Web應用程序)翻閱我已經拉的所有數據。另一種選擇是在每次需要一個ajax調用時,我需要一個來自這個文件的數據,這對我來說似乎沒有太大的效率。我猜在這種情況下異步是正確的電話嗎? –