2010-05-04 20 views
6

Tôi có một yêu cầu cross-domain bỏ phiếu dài sử dụng getJSON với một callback mà trông giống như sau:làm thế nào để giết một yêu cầu jsonp cũ hơn?

$.getJSON("http://long-polling.com/some.fcgi?jsoncallback=?" 
    function(data){ 
      if(data.items[0].rval == 1) { 
      // update data in page 
      } 
    }); 

Vấn đề là yêu cầu đến dịch vụ dài bỏ phiếu có thể mất một thời gian để trở lại, và một getJSON yêu cầu có thể được thực hiện trong thời gian chờ đợi và cập nhật trang ngay cả khi đó là phản hồi cũ.

Req1: h ** p: //long-polling.com/some.fcgi tại 10:00

Req2: h ** p: //long-polling.com /some.fcgi? tại 10:01

lợi nhuận Req1 và cập nhật dữ liệu trên trang 10:02

Tôi muốn có một cách để làm mất hiệu lực trở về từ Req1 nếu Req2 đã được thực hiện.

Cảm ơn!

Trả lời

5

Khi bạn thực hiện yêu cầu ajax, nó trả về đối tượng XMLHttpRequest. Nếu bạn muốn abort cuộc gọi, bạn có thể gọi phương thức .abort() trên đó.

var request = $.getJSON(. . . . .); 
request.abort(); 
+0

+1. Đã chuẩn bị đưa ra câu trả lời tương tự. – Boldewyn

+7

JSONP không sử dụng XMLHttpRequest, nó chèn một thẻ HTML

7

Tôi không nghĩ rằng nó hoạt động khi getJSON sử dụng phương thức JSONP thực sự hoạt động bằng cách chèn động thẻ tập lệnh mà trình duyệt của bạn thực thi. Tôi không nghĩ có cách nào để ngăn chặn trình duyệt thực hiện kịch bản ... có phải không?

+0

Đồng ý; xem câu hỏi này để biết thêm chi tiết, http://stackoverflow.com/questions/4162261/i-cannot-stop-an-ajax-request-using-jquery-and-abort-function – goggin13

1

Như @NewToDB đã đề cập, bạn không thể hủy yêu cầu jsonp (ví dụ: yêu cầu trình duyệt ngừng tải src của thẻ), nhưng bạn có thể triển khai cơ chế bỏ qua dữ liệu trả về của cuộc gọi cũ. Xác định một biến toàn cầu được tăng lên mỗi lần bạn định thực hiện cuộc gọi jsonp và chuyển giá trị của biến đó tới máy chủ dưới dạng tham số. Bạn cũng cần phải vượt qua nó truy cập trở lại từ máy chủ (Tôi giả sử bạn cũng sở hữu mã máy chủ). Nếu giá trị hiện tại của bộ đếm của bạn không bằng giá trị bộ đếm được trả về thì bạn biết rằng một cuộc gọi máy chủ khác đã được thực hiện, vì vậy bạn có thể bỏ qua dữ liệu được trả về.

// Global counter 
var callCounter = 0; 

...

$.getJSON("http://long-polling.com/some.fcgi?callCounter=" + (++callCounter) + "&jsoncallback=?" 
    function(data){ 
      if(data.items[0].rval == 1 && data.callCounter == callCounter) { 
      // update data in page 
      } 
    }); 
0

tôi sử dụng biến toàn cầu cho công việc như vậy. Đây không phải là một cách khá tốt, nhưng là cách đơn giản nhất.

if (typeof(myFooRequest) == 'object') { 
    myFooRequest.abort(); 
    myFooRequest = false; 
} 
myFooRequest = $.get("/url", function(data) { 
    // ... 
}); 
Các vấn đề liên quan