我有一個頁面顯示對象列表。這些列表中的每一個都來自ajax調用。我該如何確保它們按順序呈現?jQuery按順序呈現從Ajax請求獲取的項目
我試過使用here顯示的技術,但是如果其中一個請求失敗,它會拒絕剩下的。我的數據不依賴於前面的內容,那麼如何修改示例並處理錯誤?
我有一個頁面顯示對象列表。這些列表中的每一個都來自ajax調用。我該如何確保它們按順序呈現?jQuery按順序呈現從Ajax請求獲取的項目
我試過使用here顯示的技術,但是如果其中一個請求失敗,它會拒絕剩下的。我的數據不依賴於前面的內容,那麼如何修改示例並處理錯誤?
要知道,在另一個post,我寫了這個小解析器類,但我喜歡這個主意管道。我不知道我非常喜歡這個例子,但是稍微調整一下,我認爲它會工作得很好。我承認,儘管如此,我還沒有對此進行測試。
var urls = ["path1","path2","path3"]; // Output from string.split()
var chain = $.Deferred(); // Create the root of the chain.
var promise = chain; // Placeholder for the promise
// Build the chain
jQuery.each(urls,function(index,elem){
// Pipe the response to the "next" function
promise = promise.pipe(function(response)
{
var myurl = elem; // Get the current part
var newPromise = $.Deferred();
$.ajax
({
type: "GET",
url: myurl
}).done(function(data){
//these are your normal ajax success function params, IIRC
//do stuff with response
}).fail(function(){
//oops, it failed, oh well
//do stuff on failure
}).always(function() {
//but always resolve the sequencing promise
newPromise.resolve();
});
return newPromise;
})
});
chain.resolve();
編輯:這是一個用的jsfiddle模擬Ajax請求http://jsfiddle.net/jfcox/gFLhK/。正如你所看到的,它全部順序排列。編輯二:在評論中稍作調整。請注意,您應該可以通過向您的下一個承諾傳遞信息給您的下一個承諾...
編輯III:修改每戴夫的建議。爲了進一步分離問題,您可以在ajax請求上使用always
。
您可以保存響應列表中的數組
function response() {
responseArray[i] = response; // Where i is the sequence number of request and response;
responseHandler(); // Ping some function which can take the response in the order and process it.
}
您是否嘗試過使用jQuery.when?
http://api.jquery.com/jQuery.when/
例
http://jsfiddle.net/94PGy/4/
在其中Deferreds之一被拒絕多重Deferreds情況下,jQuery.when立即觸發其主延遲的failCallbacks。請注意,在這一點上,某些延期付款可能仍未解決。如果您需要爲這種情況執行額外的處理,例如取消任何未完成的ajax請求,則可以將引用保留在關閉中的基礎jqXHR對象中,並在failCallback中檢查/取消它們。
也許對newPromise.resolve()使用.always()? (我真的需要更多地解決這個問題。) – Dave 2012-04-06 15:25:47
解決問題的關鍵是解決承諾鏈中的當前承諾(您將永遠需要解決ajax/ajax承諾是否成功(已解決)或失敗(被拒絕),但你確實提出了一個好的觀點,而不是在完成/失敗代碼後要求解決承諾,你可以把它放在它自己的「always」調用中,並進一步分離出這個問題。 – JayC 2012-04-06 15:37:41
如果你的意思是和always一起鏈接,比如用'always'替換'pipe'調用......好吧,我認爲問題總是返回原始的promise,而pipe總是返回一個新的。但我的意思是錯誤的 – JayC 2012-04-06 15:40:18