2010-05-28 109 views
9

想象一下,我們必須通過ajax請求源代碼。當所有回調被觸發時,我想執行一些操作。等待所有ajax回調執行的最佳解決方案

(function($){ 
    var sources = ['http://source1.com', 'http://source2.com'], 
    guard = 0, 
    someHandler = function() { 
    if (guard != sources.length) { return; } 
    //do some actions 
    }; 

    for (var idx in sources) { 
    $.getJSON(sources[idx], function(){ guard++; someHandler(); }) 
    } 
})(jQuery) 

我不喜歡這裏的是,在這種情況下,我不能處理的響應失敗(例如我不能設置超時反應來。)和:這可怎麼除了這種方法來完成總體方法(我想應該有一種方法來使用更多功能的編程功能)

任何想法?

問候!

UPD:感謝解決方案與鏈回調。我找到了一個好方法here:。這是在評論提出:

(function hidenext(jq){ 
    jq.eq(0).fadeOut("fast", function(){ 
     (jq=jq.slice(1)).length && hidenext(jq); 
    }); 
})($('div#bodyContent a')) 

隨着調整它可以等待回調的最後一點點。

現在我想正確處理長時間運行的請求。任何線索?

+0

這個問題之前已經被問到過了,而不是XHR,它是一系列的DOM事件。我也不記得問題的名稱。 – 2010-05-28 10:43:06

回答

0

也許你可以「串聯」的下載,所以第一的getJSON回調觸發從下一個源下載,等等?然後在最後一次回調中,您沒有剩餘的來源,可以調用您的「完成」功能。

+0

是的,這是一個好主意!我會嘗試並回來。但仍然是響應失敗的問題... – glaz666 2010-05-28 10:57:13

+0

@ glaz666:爲什麼不能設置超時或定義處理錯誤的錯誤回調? – 2010-05-28 11:02:51

+0

如何設置超時時間? :)錯誤回撥OK – glaz666 2010-05-28 11:09:27

0

您可以在選項中始終使用$ .ajax和/或使用適當的回調函數(beforeSend,error,dataFilter,success和complete)以及「async:false」。

+1

'async:false'會在請求發出時凍結瀏覽器UI。 – 2010-05-28 10:44:12

+0

async:false - 可以是一個選項,謝謝。但在'成功'或'完整'的情況下,它不會工作,因爲它將與jQuery相同 – glaz666 2010-05-28 10:49:48

+0

我真的建議不要使用async:false,用戶體驗對於這些類型的請求永遠不會太好。 – SBUJOLD 2010-05-28 13:20:03

0

也許我錯了 - 但是規則是:AJAX的系列化 - 一次一個 讓你不得不鏈它 - 每一個響應(回調函數)必須提交反過來

下一個*。 onreadystatechange會給你一個控制權(這是一個函數)) - 在這裏你可以依次提交下一個