2011-03-15 68 views
6

我一直在jQuery 1.5中測試新的延遲AJAX函數,並且對它們的簡單性和功能印象深刻。我有一個更大的問題與排隊這些請求的最佳方式有關。如何在jQuery 1.5中管理ajax請求的隊列?

我有兩種情況:串行和並行,如果你願意的話。我想避免同步/異步條款,因爲我確實希望所有這些都是異步請求,以便用戶可以在等待隊列進行處理時執行其他操作。然後我想在隊列完成處理時調用一個函數。

在具有兩個請求我希望如下它們處理過的 「串行模式」:

RequestA - > ResponseA - > RequestB - > ResponseB - > EndOfQueue

在 「並聯模式」有兩個請求我想這樣的結果:

RequestA - > RequestB(ResponseA,ResponseB處理每當準備好) - > EndOfQueue

在這兩種情況下,如果任何請求失敗,我想隊列停止並通過控制失效功能。

我有要求,指定一個動態的隊列長度,所以我不認爲我可以只將一堆.then()或.when()延遲在一起,因爲我不知道它是否是一個或一百個項目。我通過供應商的API在服務器上執行業務邏輯,因此服務器端批處理將很困難,因爲我無法控制該代碼。

我已經建立測試用例執行「平行」的情況下,並調用()函數時畢竟已經成功完成,但這些測試是不是在隊列長度動態的,是無法移植到串行模式。

我可以看到我怎麼能創建一個自定義隊列對象來處理這個問題,但似乎一切對我來說jQuery中已經寫的部分(?)。我看了,但還沒有找到一個以這種方式覆蓋順序請求的例子。

有關如何使用jQuery的隊列/延遲的功能處理這個有什麼想法?

回答

4

實現你RequestA最簡單的方法 - > ResponseA - > RequestB - > ResponseB爲了將使用這樣的事:

var queue = []; 

function qNext() { 
    $.ajax(queue.shift()).success(qNext); 
} 

function qAjax(options) { 
    queue.push(options); 
} 

qAjax({ 
    // $.ajax options 
}); 

qAjax({ 
    // $.ajax options 
}); 

qNext(); 

請參閱DEMO

這是你的需求的略微簡化的版本,但它很容易添加一個回調運行後隊列爲空。

你確定你不想RequestA的順序 - > RequestB - > ResponseA - > ResponseB?

+0

謝謝!我會給這個鏡頭。在這個應用程序中,我們需要確保請求B在接收到響應A之前未啓動,因爲通常依賴於B的指令中A的結果。 – Graham 2011-03-15 21:08:40

+0

@Graham:觀看Pedro Teixeira的[Asynchronous Iteration Patterns](http://nodetuts.com/tutorials/19-asynchronous-iteration-patterns.html)教程。他談論Node.js,但這些模式可以用於任何JavaScript代碼。我想你可能會發現一些有用的技巧,可以幫助你做你想做的事情。當我寫我的答案時,我完全忘了它。 – rsp 2011-03-15 21:20:48

+0

非常有趣,再次感謝您的鏈接。我得到了一些關於如何構建自定義ajax隊列對象的好主意。 – Graham 2011-03-15 21:42:14

0

看到這個comment上。當()方法遞延AJAX功能

+0

是的,我實際上使用這個例子來設置我的測試用例在when()之前。我的問題是關於如何使用動態數量的ajax請求。謝謝! – Graham 2011-03-15 20:30:57

+0

mmm ...我雖然應用,但無法找到一種方法來傳遞函數執行語句作爲參數。如果有這種方式,它會看起來像'$ .when.apply(jQuery,array_of_ajax_requests_queue);'。問題是array_of_ajax_requests_queue必須像'[func1(),func2()]' – 2011-03-15 20:47:35

+0

我遇到的問題不是在when()中,而是在更多的如何啓動隊列和處理它。 – Graham 2011-03-15 20:56:11