2011-05-04 77 views
1

我正在創建一個程序,它使用AJAX/JSON從服務器獲取數據,然後使用該數據繪製到畫布上(html5)。我有一個函數調用的時候,做一些初始化,然後調用這個函數:如何在繼續執行之前等待ajax獲取數據,使用JSON?

function getClimateData(climateElement) { 
    $.ajax(
    { 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: "/Climate/yearInformation" + climateElement, 
     data: "{}", 
     dataType: "json", 
     success: function (data) { 
      weatherData = data; 
     }, 
     error: function (xhr, err) { 
      // Note: just for debugging purposes! 
      alert("readyState: " + xhr.readyState + 
        "\nstatus: " + xhr.status); 
      alert("responseText: " + xhr.responseText); 
     } 
    } 
    ) 
}; 

的問題是,所有的數據已經到達之前,調用函數繼續和借鑑了我的畫布一些東西的基礎上,數據(這不在那裏)。這種情況有時會發生。

如何在執行繼續之前確保數據已到達?

回答

3

做的工作......

success: function (data) { 
     weatherData = data; 
     // <------------------ HERE! 
    }, 

...而不是調用函數。

這就是具有回調函數的要點。

+0

是的,我想到了,但不幸的是這意味着很多重建,因爲我沒有想到這一點。但我想這是我唯一的選擇,如果沒有人有一個神奇的解決方案:) – Asgeir 2011-05-04 18:33:43

+0

從頭開始,我做了改變,並沒有那麼大的交易,現在像一個魅力,感謝很多:) – Asgeir 2011-05-04 18:42:31

2

將基於數據繪製的代碼移至成功函數中的單獨函數調用 - 或者直接將代碼直接放入成功函數中。

... 
success: function (data) { 
    // use data to do your drawing 
}, 
... 
0

這在理論上是可能使用async: false把請求轉換成同步模式,但它通常是一個壞主意。

處理這個問題的最好方法是更改​​腳本的結構,以便所有依賴於請求的事件都發生在成功回調(或從那裏調用)中。

0

你應該把繪圖功能放在你的成功回調中。這樣,繪圖功能纔會在數據到達時觸發。

相關問題