2009-02-06 81 views
3

我正在使用jQuery来做一些AJAX调用,并想知道人们如何处理这种情况。多个AJAX调用处理

  1. 向服务器发出ajax请求以检索某些信息。
  2. 在请求返回之前,发出另一个请求。第一个请求现在无效并且已过时。

如何判断初始请求现在无效,并在返​​回时可以忽略。我只想显示第二个请求的结果并忽略(或取消)第一个请求。

回答

13

的jQuery从呼叫ajax(),我已经用来实现你的愿望如下返回XmlHttpRequest对象被制成。

0

我以前从未遇到过这种情况,但是您可以发送一个密钥,您在发出请求时递增,并将密钥发送回响应。当响应到达时,您可以检查密钥以查看它是否符合您的预期。

var incrementor = 1; 
var lastSent = 0; 

jQuery(document).ready(function() { 

    jQuery('a.submitter').click(function(event) { 
     event.preventDefault(); 
     lastSent = incrementor; 
     incrementor++; 
     jQuery.post(
      'some-url.php', 
      { 
       'request-id': lastSent, 
       'other-data': 'some-data' 
      }, 
      function(data, textStatus) { 
       if(data.requestId == lastSent) { 
        // Do stuff 
       } 
      }, 
      'json' 
     ); 
    }); 

}); 
+0

我喜欢这种方法,但是如果您无法控制服务定义呢? – bendewey 2009-02-07 02:46:47

0

“我如何告诉初始请求现在是无效的”

你不...! 你排队的客户层的Ajax请求,不要让他们火以前的已经返回之前完成了自己的DOM操纵...

您可以获取有关如何做到这一点的一些细节在我的博客上关于“如何创建Ajax库” http://ra-ajax.org/how-to-create-an-ajax-library-part-7-the-ra-ajax-class.blog

+0

虽然这表现出糟糕的用户体验。 – Craig 2009-02-06 23:39:40

+1

-1取消用户请求是一个有效的用例。 – cletus 2009-02-06 23:40:40

+0

@Cletus - 当然,如果你的服务器是一个“愚蠢的databucket”,但是如果你的服务器上有业务逻辑(而不是客户端上的JS),那么你的Ajax请求可能实际上会影响客户端。取消它显然不是一个选择... – 2009-02-07 08:34:56

2

保留标识请求的变量(例如:“request_id”)的记录。在每个新请求中向变量添加1。只有在服务器返回的request_id等于您在客户端上拥有的变量时才处理该请求。

var lastRequest; 
function getSomeData() { 
    if(lastRequest) { 
     lastRequest.abort(); 
     lastRequest = null 
    } 
    lastRequest = $.ajax(...); 
} 

的净效应是,早些时候提出的回应是,如果后续请求忽略:

-1

我不希望涉及服务调用,您可能无法始终控制服务定义。我想看到类似这样的东西

$(function() { 
    $('.ajaxButton').click(function() { 
     $.currentCallId = (new Date()).getTime(); 

     $.ajax({ 
      type: "get", 
      url: 'http://www.google.com/', 
      beforeSend: function(xhr) { 
       this.callId = $.currentCallId; 
      }, 
      success: function(data) { 
       if (this.callId === $.currentCallId) { 
        // process it 
       } else { 
        // throw it out 
       } 
      } 
     }); 
    }); 
});