2011-08-09 19 views
1

在jQuery中,我遍歷xml列表區域並執行POST請求以獲取有關每個區域。由於一次發送數千個請求會損害客戶端和服務器,因此我想設置一個標誌,以便在發送後續[下一個]請求之前等待請求完成。

如果XML看起來像這樣:

<area>5717</area> 
<area>5287</area> 
<area>5376</area> 

則XML有點解析看起來像:

$(xml).find("area").each(function() { 
    doPost(); 
} 

和的doPost()函數看起來像

doPost : function() { 
    $.post(...) 
} 

基本上,我想添加一個切換「等待」,但我不知道如何實現這一點。有沒有一種方法可以保持基本的「.each」迭代,或者是另一種更好的循環類型?

在此先感謝。

回答

1

您可以使用:

$.ajaxSetup({async:false}); 

在腳本的頂部,讓您的AJAX調用同步。

或者,您可以將$.post()替換爲$.ajax(),並將async標誌設置爲false

+0

問題在於,它隨後成爲OP請求的阻止操作 –

+0

...。如果計劃要按順序執行這些帖子,那麼假設其他事件不需要同時處理似乎是安全的。 @sova,你能否證實或否認這個假設? –

+0

是的,我想我是在假設這將是一個後臺任務的頁面 –

3

一個通用的算法: 你可以把整個列表放到一個數組中。拿出陣列的第一個項目併發布。在您的文章的成功處理程序中,您可以遞歸調用具有列表中下一個索引的函數。

我不會使用async:false,因爲這會是一個阻塞操作,我認爲OP不需要。

+1

我假定異步:false使得POST同步,並且這不是我想要的,正確 – sova

+0

@Keith,輕微nitpicky更正:該調用將不會遞歸。回調不是遞歸調用,調用者不是先前的堆棧幀。 –

+0

是的,你是對的Frederic –

1

你可以做setTimeout嗎?這將允許該功能仍然處理異步,並允許您在那裏等待一段時間。

http://www.w3schools.com/js/js_timing.asp

setTimeout(function() {}, 5000) 
+0

setTimeout在某些情況下很有用,但不太可靠;可能會有大約10,000個帖子請求(獲取詳細信息並將其繪製到地圖上),因此,如果它們每個都等待5秒鐘,這是一個很大的失敗,並且如果沒有足夠的等待時間,那麼客戶端將陷入困境但是,我確實喜歡思考的方向=) – sova

+1

@Matt,請重新考慮引用w3schools。請參閱http://w3fools.com/。 –

+0

@FrédéricHamidi,感謝您的鏈接。 – Matt

1

可以重構doPost()功能採取<area>元素來處理作爲參數,並鏈到下一個元素從success回調。喜歡的東西:

(function doPost($area) { 
    if ($area.length > 0) { 
     $.post({ 
      // your options, 
      success: function() { 
       // your success handling... 
       doPost($area.next("area")); 
      } 
     }); 
    } 
})($(xml).find("area").first()); 

編輯:也許上面的代碼是有點過於緊湊確實如此。

基本上,目的是重構您的功能,使得它需要包含下一<area>元件來處理jQuery對象,或什麼,如果處理應該停止:

function doPost($area) { 
    if ($area.length > 0) { 
     // Perform POST request and call ourselves from success callback 
     // with next <area> element (or nothing if there's no such element). 
    } 
} 

然後調用該函數與所述第一<area>要處理的元素:

doPost($(xml).find("area").first()); 

我的答案中的第一個代碼段同時執行。函數是Javascript中的first-class objects,你可以通過用括號括起它的定義並提供通常的參數列表來調用你剛纔定義的函數,這個參數列表也被圓括號所包圍。

+0

很酷!非常感謝Frédéric! – sova

+0

能否詳細說明一下tad的語法? (...))($(xml)...有點令人難以置信 – sova

+1

@sova,我可能壓縮了代碼太多,看到我的更新答案。我個人喜歡這種語法,因爲它允許定義一個遞歸或回調鏈,並在相同的聲明中啓動它。您的里程可能會有所不同,當然:) –