2012-10-03 42 views
0

可能重複:
jQuery AJAX: return value on successJavascript代碼不可調用時

林有當我嘗試通過查詢得到一個JSON文件,這種怪異的參考問題:

var themeData; 
    $.getJSON("json/sample.js", function(data) { 
       themeData = data.theme; 
         console.log(themeData.sample[0].description); 
      }); 
    console.log(themeData.sample[0].description); 

第一個console.log起作用,第二個不起作用。這是爲什麼發生?

回答

5

這是第二個(按照時間順序在你的代碼中)沒有被擊中。那是因爲它尚未設置。從服務器返回後,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 
}); 
+0

呃,但是這個解決方案只會將範圍限制到這個特定的回調函數。我需要通過整個文檔訪問這些信息。我應該考慮一種不同的方法嗎? –

+0

@ CarlosR.Batista看到我上面的更新 - 你可以強制它是一個同步調用,然後你的代碼將工作。儘管如此,同步呼叫還是應該謹慎使用,因爲它們會在等待服務器時阻塞客戶端腳本。 – McGarnagle

+0

以及事情是,即時消息只是拉這個JSON文件一次,而客戶端將花費大約30分鐘在同一頁面(它的一個Web應用程序)翻閱我已經拉的所有數據。另一種選擇是在每次需要一個ajax調用時,我需要一個來自這個文件的數據,這對我來說似乎沒有太大的效率。我猜在這種情況下異步是正確的電話嗎? –

0

沒有,$.getJSON是一個異步方法,當第二console.log被調用時,有沒有themeData在那個時候。