2010-12-06 35 views
7

我正在循環處理幾個項目,併爲它們中的每個項目(使用jQuery)發出ajax請求。我希望它們獨立執行,但是按照它們被調用的順序填充到DOM中,而不是它們返回的順序(出於某種原因某些請求比其他請求花費更長的時間)。關於這種類型的最佳做法的任何提示?在做幾個Ajax回調時維護請求的順序

+0

連接的請求,以便場每有存儲在內存中的全局位數據(可能附加到「持有格」),並在每個成功調用通用模塊,如果全部成功,將嘗試加載它們。聽起來你將有相當多的互斥體來保存這種設計的模式。 ~~至於最佳做法,請保持代碼清潔和可讀。 – jcolebrand 2010-12-06 21:54:05

回答

1

您可以將所有成功結果對象發送到隊列。有與原始請求一起發送的索引,並不斷檢查該隊列是否存在下一個索引。

但是,通常瀏覽器只允許兩個同時發出的ajax請求,所以在前一個請求成功時發送下一個ajax請求可能是值得的。

這裏的代碼開始:

var results = {}, lastProcessedIndex = 0; 
var totalLength = $('a.myselector').each(function(el, index){ 
    $.ajax({ 
     url: $(this).attr('href'), 
     success: function(result){ 
      results[index] = result; // add to results object 
     } 
    }); 
}).length; 

var intervalId = setInterval(function(){ 
    if(results[lastProcessedIndex]){ 
     // use object 
     lastProcessedIndex++; 
    } 
    else if(totalLength == lastProcessedIndex){ 
     clearInterval(intervalId); 
    } 
}, 1000); // every 1 second 
+0

是的,我也發現這個jQuery ajax隊列管理器,我認爲基本上你在這裏描述的是:http://www.protofunc.com/scripts/jquery/ajaxManager/ – Chris 2010-12-07 02:37:04

0

我會採取刺傷在黑暗中與這一個,但它可能的幫助。也許你可以創建一個全局緩衝區數組,然後只要AJAX返回,就可以將結果添加到緩衝區。然後你可以設置一個定時器,當它被觸發時,它將檢查緩衝區的內容。如果它們是爲了它將相應地輸出它。

8

那麼結果可以以任何未定義的順序返回,它們是異步的並且受到互聯網和服務器的變幻莫測的影響。

你可以做的是用TCP在UDP上做的相同的方式處理這個問題。您使用序列標識符。

保留一個序列標識符,並在每次發送請求時增加它。當請求返回時,請按順序檢查它們,並且僅在它們進來時處理它們。保留一個列表,列出按順序返回的數據,並在每次更新後檢查該列表。當第一個期望進入時,它應該將整個列表處理到第一個缺口。

請記住,您可能會丟失一個請求,因此在忽略給定的序列標識符之前,合適的超時值將按順序排列。