2011-04-21 112 views
1

我有一個應用程序在第一次運行時加載多個資源,這些資源存儲在localStorage中。我有一個函數,檢查是否所有的本地存儲變量設置,以便該部分工作正常。如何檢測幾個AJAX請求已完成或失敗?

我的工作的方法是這樣的:

  1. 顯示加載消息。
  2. 初始化AJAX請求。
  3. 啓動計時器間隔以檢查是否所有內容都已加載。
  4. 當數據加載時,初始化應用程序等。
  5. 如果數據未加載,則顯示錯誤消息。

問題是#5 - 如何檢測是否有錯誤?例如,如果出現連接問題或服務器因任何原因而發回無效數據。這裏是我當前的代碼 - downloadData只是進行基本的AJAX請求:

// check local storage and download if any missing 
if (!checkLocalStorage()) 
{ 
    $('#content').before('<div class="notice" id="downloading">Downloading data, please wait...</div>'); 
    for (var i in db_tables) 
    { 
     if (localStorage[db_tables[i]] == null) 
      downloadData(db_tables[i]); 
    }  
} 

// check progress 
var timer = setInterval(function() { 
    if (checkLocalStorage()) 
    { 
     // everything is downloaded 
     $('#downloading').hide(); 
     clearInterval(timer); 
     initApp(); 
    } 
}, 500); 

回答

3

你可以把它轉一下嗎?類似這樣的(具有明智的變量名稱和「真實的」API)將簡化以下內容:

  1. 顯示加載消息。
  2. 實例化應用程序初始化程序ai
  3. 擡起AJAX請求:
    • 成功處理程序調用ai.finished(task)
    • 錯誤處理程序調用ai.error(task)
    • 註冊初始化程序ai.register(task),以防止「您需要太長時間」檢查。
  4. 一旦所有的AJAX請求都要求ai.finished,初始化應用程序等
  5. 如果有任何的所謂ai.error AJAX的任務,則顯示錯誤消息,並開始清理東西。

這樣你就不需要setInterval(),單個的AJAX任務會告訴你他們什麼時候完成或者摔倒了。您可能仍然希望間隔處理耗時過長的任務,但大多數邏輯將基於通知而不是基於輪詢。

0

眼看downloadData實際Ajax調用會有所幫助,但我建議你看看在jquery AJAX API一次。 Ajax調用的回調不僅僅是爲了全面完成,特別是對於包括錯誤在內的成功和失敗。嘗試執行重試操作,如果出現錯誤,並且如果繼續失敗,則可以警告用戶。您也可以使用這些回調來在加載完成時通知您的應用程序,而不是使用間隔計時器。

+0

問題是,服務器可能會返回200響應,但數據不正確(例如PHP/MySQL錯誤或其他)。 – DisgruntledGoat 2011-04-21 09:27:16