как убить старый запрос jsonp? - PullRequest
6 голосов
/ 04 мая 2010

У меня междоменный длинный опросный запрос с использованием getJSON с обратным вызовом, который выглядит примерно так:

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

Проблема в том, что запрос к сервису длинных опросов может занять некоторое время, и в это же время может быть сделан другой запрос getJSON, который обновит страницу, даже если это устаревший ответ.

Req1: h ** p: //long-polling.com/some.fcgi at 10:00

req2: ч ** р: //long-polling.com/some.fcgi? в 10:01 утра

Req1 возвращает и обновляет данные страница 10:02

Мне нужен способ аннулировать возврат из Req1, если Req2 уже выполнен.

Спасибо!

Ответы [ 4 ]

7 голосов
/ 05 мая 2010

Я не думаю, что это работает, так как getJSON использует метод JSONP, который на самом деле работает, динамически вставляя тег скрипта, который выполняет ваш браузер. Я не думаю, что есть какой-либо способ остановить браузер от выполнения скрипта ... есть?

5 голосов
/ 04 мая 2010

Когда вы делаете запрос ajax, он возвращает объект XMLHttpRequest. Если вы хотите abort вызов, вы можете вызвать метод .abort() для него.

var request = $.getJSON(. . . . . );
request.abort();
1 голос
/ 11 августа 2011

Как упомянуто @NewToDB, вы не можете отменить запрос jsonp (например, сказать браузеру прекратить попытки загрузки src тега), но вы можете реализовать механизм, который эффективно игнорирует возвращенные данные старого вызова. Определите глобальную переменную, которая увеличивается каждый раз, когда вы собираетесь выполнить вызов jsonp, и передать значение этой переменной на сервер в качестве параметра. Вам также нужно передать счетчик обратно с сервера (я полагаю, у вас также есть код сервера). Если текущее значение вашего счетчика не равно возвращенному значению счетчика, то вы знаете, что другой серверный вызов уже был выполнен, поэтому вы можете игнорировать возвращенные данные.

// 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 голосов
/ 20 октября 2011

Я использую глобальную переменную для такой задачи. Это не очень хороший способ, но самый простой.

if (typeof(myFooRequest) == 'object') {
  myFooRequest.abort();
  myFooRequest = false;
}
myFooRequest = $.get("/url", function(data) {
  // ...
});
...