Прерывание jQuery-запроса JSONP приведет к ошибке - PullRequest
7 голосов
/ 02 марта 2012

Я делаю простой плагин autosuggestion (автозаполнение) с jQuery.К сожалению, я должен использовать JSONP.Это нормально, и это работает, но когда я отменяю запрос, он выдаст ошибку.

Uncaught TypeError: Property 'jQuery171036404498340561986_1330693563756' of object [object Window] is not a function

Есть код

if(xhr) {xhr.abort()};
xhr = $.ajax({
    url: "someurl/getmedata",
    type: 'get',
    dataType: 'jsonp',
    data: {q: "query"},
    success: function(results) {},
    error: function() {}
})

Классический способ с json, xml или другим запросом работает нормально.

Любое предложение?

Ответы [ 3 ]

14 голосов
/ 02 марта 2012

JSONP не не использует XMLHTTPRequest, но фактически создает тег <script> в документе, чтобы иметь возможность выполнять междоменные запросы.

Вы просто не можете прерватьЗапросы JSONP.

Это указано в документации $. Ajax () :

Некоторые типы запросов Ajax, например JSONP и междоменные GET-запросы не используют XHR ;в этих случаях параметры XMLHttpRequest и textStatus, переданные обратному вызову, не определены.

Что касается jQuery 1.5+, ранее он возвращал объект XHR из $ .ajax (), теперь он возвращает расширенный объект jqXHRкоторый инкапсулирует объект XHR.

Когда механизм транспорта отличается от XMLHttpRequest (например, тег сценария для запроса JSONP), объект jqXHR по возможности имитирует встроенную функциональность XHR .

Таким образом, он возвращает объект, но некоторые функциональные возможности фактически недоступны, например .abort ().


Плагин jQuery-JSONP предлагает возможность вручную прервать запросы JSONP.Я сам этим не пользовался, но стоит попробовать.

4 голосов
/ 02 марта 2012

jQuery использует тег <script> для реализации JSONP.Вы не можете прервать загрузку тегов скрипта.

0 голосов
/ 28 июня 2014

Прежде всего, используйте некоторую логику последовательности. Это гарантирует, что ваш последний запрос превалирует над старым. Здесь у вас есть пример .

Кроме того, вы можете воспользоваться этими $.ajax настройками:

timeout: установить ограничение по времени для запроса и предотвратить молчание при сбое запросов.

beforeSend: Перед выполнением вызова подтвердите некоторые условия. Дополняет помощник секвенирования.

As of jQuery 1.5, the beforeSend option will be called regardless of the type of request.

Пример:

function updateResults() {

  // Init counter & record current request
  if (!window.reqSeq)  window.reqSeq = 0;
  window.reqSeq +=1;
  var thisRequest = window.reqSeq;

  $.ajax({
    url: [..],
    crossDomain: true, 
    contentType: "application/json",
    dataType: 'jsonp',
    timeout: 5000, // give 5 seconds of margin
    data: { [..] },
    beforeSend: function() {
      if(thisRequest < window.reqSeq) {
        return false;
      }
    },
    success: function(data, textStatus, jqXHR) {
      if(thisRequest < window.reqSeq) {
        return;
      }
      else print(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
      // it'll be called on timeout (error) and beforeSend (abort)
      print(textStatus);
    }
  });

}
...