0
我試圖做到以下幾點:併發處理的Ajax請求
- 我有一個鏈接列表,點擊時分別執行不同的Ajax調用。
- 每個Ajax響應都會被指定一個目標,它將被顯示。
- 在處理請求時,鏈接仍然可以被點擊(=進一步的Ajax調用)。
- 下面的例子有兩個目標和四個鏈接:兩個指向DIV#d1,兩個指向DIV#d2。
如何確保只發送最後一個請求的響應最終會顯示在其目標DIV中?
如果我點擊標記爲Data1
,然後Data2
的鏈接,則必須中止第一個調用,因爲Response1可能在Response2之後到達。這個問題似乎意味着我必須跟蹤以前對每個目標的請求,所以只要有新的請求,我就可以放棄它們。
我寫過這段代碼。我想知道你是否認爲這是正確的做法。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
</head>
<body>
<ul>
<li><a href="data1.htm" class="trigger" data-target="d1">Data 1</a></li>
<li><a href="data2.htm" class="trigger" data-target="d1">Data 2</a></li>
<li><a href="data3.htm" class="trigger" data-target="d2">Data 3</a></li>
<li><a href="data4.htm" class="trigger" data-target="d2">Data 4</a></li>
</ul>
<div id="d1"></div>
<div id="d2"></div>
<script type="text/javascript" src="/test/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
$(function(){
var register = {};
$(".trigger").on("click", function() {
var target = $(this).attr("data-target");
var url = $(this).attr("href");
if (register[target] == undefined) register[target] = [];
ajaxCall = $.get(url, function(data) { // Ajax request
$("#" + target).html(data);
});
for (a in register[target]) { // Aborts existing ajax requests for this target
register[target][a].abort();
}
register[target] = []; // Empty register for this target
register[target].push(ajaxCall); // Register current ajax request
return false;
});
});
</script>
</body>
</html>
感謝您的意見和乾淨的代碼。我仍然認爲''register [target]'應該清除每個中止的請求(這實際上與在循環之後清除整個數組相同),然後再推入新的調用。所以我會保留行'register [target] = [];' –