我有一個div的jQuery集合。對於每個div我必須做兩個ajax調用,而第一個調用返回一個由第二個調用使用的id。所有的Ajax調用都需要一些時間(比如說一秒鐘)。定義幾個Ajax調用的順序
如果我做這樣的事情:
$divs.each(function(index, element) {
$.get('/some/url').done(function (id) {
$.post('/some/other/url?id=' + id).done(function() {
$(element).doSomething();
});
})
});
那麼所有得到通話將首先完成,然後將所有後電話。但這並不是錯誤的,我希望儘早執行呼叫,以便儘早向用戶顯示第一個結果。
所以我不想:
get, get, get, get, get, get, get, get, post, post, post, post, post, post, ...
,而這一點:
get, get, get, get, get, post, get, post, get, post, get, post, get, post, ...
換句話說,只要對一個div第一次調用完成後,立即開始第二個電話。不要等到所有的第一個電話完成。
我想我必須排隊打電話。我一定要嗎?或者我怎麼能做到這一點?
注意:瀏覽器只能並行執行有限數量的ajax調用。 Firefox中的AFAIK 6默認(Connections per Hostname)。$.get()
調用可能很快,但連接限制會導致提取可能需要一些時間。 6個隊列會有幫助嗎?或者我應該爲每個div有一個隊列?
一個額外的任務將是取消整個處理,如果這也是可能的。
更新/解決方案:人們不明白我的問題是什麼。正如一些人現在所建議的,我已經使用了priorityQueue in async庫。有了這個,我可以減少未決連接的數量並控制請求的順序。
如果按照現在的方式進行操作,它確實是最快的。 (除非你能夠將它們全部合併爲一個)。否則,如果延遲了任何獲取請求,用戶將總體上必須等待更長的時間才能完成。 –
@KevinB你是這麼認爲的嗎?我看到整個處理時間不會改變。這只是一種重新排序,因此可以提前顯示一些結果。 – robsch
Gotcha。重新排序會使整體花費更長的時間,但由於前面提出了一些結果,因此會被認爲更快。我建議先取第一個,比如說3,然後取其餘的。 –