Javascript 处理并发Ajax请求

Javascript 处理并发Ajax请求,javascript,jquery,Javascript,Jquery,我正在努力做到以下几点: 我有一个链接列表,每个链接在单击时执行不同的Ajax调用 每个Ajax响应都分配了一个显示目标 在处理请求时,仍然可以单击链接(=进一步的Ajax调用) 下面的示例有两个目标和四个链接:两点到DIV#d1,两点到DIV#d2 我如何确保只有最后发送的请求的响应最终会显示在其目标DIV中 如果单击标记为Data1的链接,然后单击Data2,则必须中止第一个调用,因为Response1可能在Response2之后到达。这个问题似乎意味着我必须跟踪每个目标以前的请求,以便

我正在努力做到以下几点:

  • 我有一个链接列表,每个链接在单击时执行不同的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>

$(函数(){ 变量寄存器={}; $(“.trigger”)。在(“单击”,函数(){ var target=$(this.attr(“数据目标”); var url=$(this.attr(“href”); 如果(寄存器[target]==未定义)寄存器[target]=[]; ajaxCall=$.get(url,函数(数据){//Ajax请求 $(“#”+target).html(数据); }); 对于(寄存器[target]中的a]){//中止此目标的现有ajax请求 寄存器[target][a]。中止(); } 寄存器[target]=[];//此目标的寄存器为空 注册[target].push(ajaxCall);//注册当前ajax请求 返回false; }); });
我认为你的想法是对的。但是,您不应该使用
for in
在数组上循环。另外,您可能希望首先中止所有调用(只是为了确保)

实际上,您正在清除每个请求的数组,并且只使用一个ajax调用填充它。在这种情况下,没有必要在数组上循环,因为您知道如果数组不是空的,它将只包含一个元素。另一方面,您不知道它是包含零个元素还是一个元素,因此循环是中止调用(如果存在)的最简洁的方法

此外,您还可以使用
.data
获取
数据-
属性

最后,您可以使用
|
技巧

var target = $(this).data("target"),
    url = $(this).attr("href");

register[target] = register[target] || [];

$.each(register[target], function() {
    this.abort();
});

ajaxCall = $.get(url, function(data) { // Ajax request
    $("#" + target).html(data);
});

register[target].push(ajaxCall); // Register current ajax request

感谢您的评论和干净的代码。但我仍然认为,
register[target]
确实应该在传入新调用之前清除每个中止的请求(这实际上与在循环后清除整个数组相同)。因此,我将保持行
register[target]=[]