2012-04-06 38 views
0

我有一個頁面顯示對象列表。這些列表中的每一個都來自ajax調用。我該如何確保它們按順序呈現?jQuery按順序呈現從Ajax請求獲取的項目

我試過使用here顯示的技術,但是如果其中一個請求失敗,它會拒絕剩下的。我的數據不依賴於前面的內容,那麼如何修改示例並處理錯誤?

回答

2

要知道,在另一個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

+0

也許對newPromise.resolve()使用.always()? (我真的需要更多地解決這個問題。) – Dave 2012-04-06 15:25:47

+0

解決問題的關鍵是解決承諾鏈中的當前承諾(您將永遠需要解決ajax/ajax承諾是否成功(已解決)或失敗(被拒絕),但你確實提出了一個好的觀點,而不是在完成/失敗代碼後要求解決承諾,你可以把它放在它自己的「always」調用中,並進一步分離出這個問題。 – JayC 2012-04-06 15:37:41

+0

如果你的意思是和always一起鏈接,比如用'always'替換'pipe'調用......好吧,我認爲問題總是返回原始的promise,而pipe總是返回一個新的。但我的意思是錯誤的 – JayC 2012-04-06 15:40:18

0

您可以保存響應列表中的數組

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. 
} 
+0

我還沒有完全理解你的回覆,所以請糾正我,如果我錯了,但在這種情況下,我不必等待所有的請求之前完成渲染? – zsquare 2012-04-06 13:12:55

+0

沒有您收到響應,responseHandler()函數將被調用,該函數將解析數據。 – 2012-04-06 13:16:48

+0

我不認爲這回答OP的問題。 Ajax響應可能不符合其請求的順序。 – JayC 2012-04-06 14:20:30

0

您是否嘗試過使用jQuery.when?
http://api.jquery.com/jQuery.when/


http://jsfiddle.net/94PGy/4/

在其中Deferreds之一被拒絕多重Deferreds情況下,jQuery.when立即觸發其主延遲的failCallbacks。請注意,在這一點上,某些延期付款可能仍未解決。如果您需要爲這種情況執行額外的處理,例如取消任何未完成的ajax請求,則可以將引用保留在關閉中的基礎jqXHR對象中,並在failCallback中檢查/取消它們。