2009-02-06 121 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 
       } 
      } 
     }); 
    }); 
});