2011-07-22 34 views
3

我的問題是這個問題的一個變種here當所有的AJAX請求是完整的jQuery呼叫功能

然而,有兩點不同:

  1. 我不知道AJAX多少要求有。當然,至少有10個。它們同時運行或幾乎同時運行,並且每次請求的數量都會發生變化。

  2. ,我想調用的函數使得AJAX請求爲好。我不希望AJAX請求永遠持續下去(這是我第一次嘗試時發生的情況)。我只想要一次這個功能。

這裏是我的代碼:

$("#calculateButton").ajaxComplete(function() { 
    $(this).unbind(); 
    $(this).click(); 
}); 

所以我試圖做的就是附加ajaxComplete回調計算按鈕。問題是每次ajax請求結束時都會執行此操作。而我想要的功能是在全部 AJAX請求完成時執行。

有沒有辦法做到這一點。當我寫出來時,聽起來很複雜。我應該放棄,並創建一個hacky變通?

回答

7

使用.ajaxStop(),而不是當前的方法。

$("#calculateButton").ajaxStop(function() { 
    $(this).unbind(); // $(this).unbind("ajaxStop") -> this is not needed as unbind will remove everything, but leaving it here as an FYI 
    $(this).click(); 
}); 

http://api.jquery.com/ajaxStop/

注:以上更新後的代碼停止無限循環。

+0

據我所知,當他想調用的函數停止進行AJAX調用時,也會調用它。這意味着這將是無限循環(在所有請求停止後,回調將被調用,並且在它內部的請求停止後,它將再次被觸發等等)。這可能是OP解決它的第一次嘗試 - 據我所知,它失敗了。 – Tadeck

+0

編輯我的答案,以防止這種情況。 – Mrchief

+0

@Tadeck:實際上,原始代碼阻止了這種情況,因爲'.unbind()'將刪除所有的處理程序。 – Mrchief

0

您可以使用deferred objects [docs] jQuery的1.5推出。

如何設置這取決於你如何讓Ajax調用,但通常是這樣的:

$.when(callAjaxA(), callAjaxB(), callAjaxC(), ...).then(callAjaxFinal); 

其中callAjaxX函數將返回由$.ajax返回的承諾目標。您還可以通過pipe[docs]輕鬆添加新的電話。

一旦callAjaxX發出的所有請求,完成這將執行callAjaxFinal

0

你可能需要創建一些局部變量,這將是訪問的形式每個請求。我們稱它爲ajaxCount並在開始時將0(零)指定給它。

對於每一個要計算爲阻止您的功能的請求,增加ajaxCount增加一個。在當這個特定的請求完成(用錯誤或成功)執行回調,減少ajaxCount1(之一)

另外,如上所述,您減少ajaxCount只是後逢回調中,調用另一個函數,這將檢查是否ajaxCount等於0(零)。如果測試結果是肯定的(意味着此時沒有AJAX請求發生),請執行您想要的操作。

這是基本思想,實現起來相當簡單。如果您對此有任何疑問,請告訴我。

+0

我嘗試過這樣的事情,但問題是如果有同步JavaScript Ajax調用,最終只會在下一次調用時立即返回0。讓我知道你是否有解決方案! –