2011-09-28 42 views
1

我想找到一種方法來跟蹤成功的Ajax返回使用JavaScript只有不jQuery或其他庫。我想要做的是在函數觸發時顯示加載圖形,並在返回所有結果時清除圖形。我的函數分解輸入並調用定義數量的ajax請求。javascript - 跟蹤成功的Ajax請求/返回

我讀到,沒有直接的方法來做到這一點。我試圖設置一個函數來計算成功的請求,但我正在陷入一個我無法解決的邏輯障礙。我的基本大綱如下:

TIA

被編輯爲更新解決方案。

的解決方案是創建克拉作爲一個全局變量 我的工作代碼大綱是

var ct = 0;//declare outside of function as global 


function ajaxcallback(...) { 
... 
if (success) 
{ 
//output/do something 
ct++; //increase global ct by 1 

countajax (total);//call countajax 

} 
}//end function 

function countajax (total) 
{ 
    if (ct == total) 
    { 
    //turn off loading graphic 
    } 
}//end countajax 

我想功能countajax是沒有必要的,CT的==總無需調用函數來完成的比較countajax。

+0

你在你的'if'塊中缺少第二個'='。 –

+0

感謝亞當,但那不會解決問題。 – Jamex

回答

0

其實是有做這是一個非常簡單的方法:

電話從每一個Ajax回調中的方法,並確保這個功能其實只是做任何事情,如果所有的Ajax調用完成後,像這個:

(function() { 
    var ajax1_done = ajax2_done = ajax3_done = false; 

    function ajax1_callback() { 
     ajax1_done = true; 
     run_when_all_is_done(); 
    } 

    function ajax2_callback() { 
     ajax2_done = true; 
     run_when_all_is_done(); 
    } 

    function ajax3_callback() { 
     ajax3_done = true; 
     run_when_all_is_done(); 
    } 

    function run_when_all_is_done() { 
     if(ajax1_done && ajax2_done && ajax3_done) { 
     //do stuff here 
     } 
    } 
})(); 
+0

感謝Martin,我認爲這很好,但我需要動態生成「ajax_done」變量的數量。你的解決方案和Brians解決方案使我不得不聲明一個全局變量,這讓我猶豫不決,但它有效。一旦測試,我將分享解決方案。 – Jamex

+0

你不需要一個全局變量 - 使用閉包。看看我更新的答案,看看如何。包裝代碼的直接函數作爲其內部聲明的變量的局部範圍。 –

0

做到這一點的一種方法是保留一個變量,用於跟蹤您提出的請求數和另一個跟蹤您收到的響應數的變量。然後,在您啓動所有ajax調用後,啓動一個輪詢器(setInterval),該輪詢器檢查響應計數變量以匹配總請求變量。

var totalRequests = 0, 
    successfulRequests = 0, 
    poller = null; 

// psuedo code 
totalRequests++; 
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */); 

totalRequests++; 
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */); 

totalRequests++; 
ajax("http://server.com", function(resp){ successfulRequests++; } /** callback */); 

// run poller after you've kicked off all your ajax requests 
poller = window.setInterval(function(){ 
    if(totalRequests === successfulRequests){ 
    alert("all ajax finished"); 
    window.clearInterval(poller); 
    poller = null; 
    } 
},100); 
+0

感謝Brian,我會嘗試這個方法,並希望它適用於我的情況。 – Jamex