Обработка тайм-аута getJSON

Я использую функцию jQuery getJSON() . Эта функция получает данные без проблем. Но иногда ждут, жду ожидания ... И моя загрузочная панель, показывающая загрузку загружаемого груза в центр страницы.  Таким образом, функция jQuery ajax() имеет переменную тайм-аута. Но я хочу использовать функцию getJSON . И я думаю, что я могу использовать функции ajaxStart() и ajaxStop() . Но как?

$('.loadingDiv')
    .hide()
    .ajaxStart(function() {
        $(this).fadeIn();
        setTimeout("throw '';",15000) //i used this but didn't work
        setTimeout("return;",15000) //i used this but didn't work
        setTimeout("abort();",15000) //i used this but didn't work.(Abort all ajax events)
    })
    .ajaxStop(function() {
        $(this).fadeOut();
    });
19
добавлено отредактировано
Просмотры: 2
Когда вы передаете строки в setTimeout (которые вы должны never делать), это eval s в глобальной области. Таким образом, вы не можете вернуть из него.
добавлено автор Rocket Hazmat, источник
@Asad: OP говорит, что он хочет использовать $. GetJSON вместо $. Ajax .
добавлено автор Rocket Hazmat, источник
Что не так с использованием более явной функции $. Ajax ? Это может быть больше строк кода, но это помешает вам создавать такие проблемы.
добавлено автор Rocket Hazmat, источник
@ lethal-guitar: Я знаю это. Я просто повторил повторение, было сказано в вопросе.
добавлено автор Rocket Hazmat, источник
Вы должны установить тайм-аут при вызове .ajax
добавлено автор Asad Saeeduddin, источник
@RocketHazmat: $. GetJSON - это просто оболочка для $. Ajax . См. Руководство: api.jquery.com/jQuery.getJSON
добавлено автор lethal-guitar, источник
@Rocket Hazmat Возможно, OP не понимал, что .getJSON - это то же самое, что и вызов .ajax . В любом случае вызов .getJSON не позволяет использовать параметр timeout
добавлено автор renab, источник
Спасибо за ваши ответы ...
добавлено автор pheaselegen, источник

6 ответы

getJSON() returns a promise on which you can call the abort function :

var p = $.getJSON(..., function(){ alert('success');});
setTimeout(function(){ p.abort(); }, 2000);

EDIT : but if your goal is just to abort if it takes too much time, then lethal-guitar's answer is better.

15
добавлено
но это не поможет или не будет? время, которое берется для getJSON , - это сборы, ожидающие завершения сценария на стороне сервера, и если это занимает время, то прерывание запроса, а затем отправка другого не поможет
добавлено автор Muhammad Omer Aslam, источник
+1, потому что он позволяет OP использовать .getJSON , а не .ajax
добавлено автор renab, источник
Да, истинный ответ - использовать Ajax. Но я тоже написал в своем вопросе. Во всяком случае, этот ответ был полезен. Благодарю.
добавлено автор pheaselegen, источник

getJSON() is just a shorthand for the following:

$.ajax({
    dataType: "json",
    url: url,
    data: data,
    success: success
});

So you could use $.ajax() and specify the timeout option as desired. See also: http://api.jquery.com/jQuery.getJSON/

15
добавлено
+1 это, вероятно, более полезно для OP, чем мой ответ.
добавлено автор Denys Séguret, источник
Существует аналогичный ответ здесь , который может быть расширен для добавления тайм-аута для jQuery ajax-вызова.
добавлено автор shasi kanth, источник
+1 точно, что я думал (отсюда сходство в наших ответах, вы были быстрее на ничью)
добавлено автор renab, источник

Как упоминалось в смертельной гитаре, функция getJSON() является просто сокращением для $. Ajax() . Если вы хотите определить, произошел ли тайм-аут, а не фактическая ошибка, используйте приведенный ниже код.

var request = $.ajax({
    dataType: "json",
    url: url,
    data: data,
    success: function( ) { },
    timeout: 2000
}).fail( function( xhr, status ) {
    if( status == "timeout" ) {
       //do stuff in case of timeout
    }
});
10
добавлено
@noahnu Спасибо. исправленный.
добавлено автор Bruno, источник
Typo: == not =
добавлено автор noahnu, источник

Там всегда есть ядерный путь:

//Set AJAX timeout to 10 seconds
$.ajaxSetup({
  timeout: 10*1000
});

Это установит все запросы AJAX, которые ваша программа делает (даже через $ .getJSON), чтобы иметь время из 10 секунд (или что у вас есть).

3
добавлено
Я пробовал это, используя 1) $ .getJSON с URL-адресом и 2) $ .ajax с атрибутами только «url» и «dataType». $ .ajax уважает глобальный тайм-аут (устанавливается с использованием фильтра с потоком нити на моем локальном сервере), а $ .getJSON - нет. Похоже, это может быть ошибка в $ .getJSON.
добавлено автор Jasman, источник

функция setTimeout выполняет набор кода после заданного количества milisecons в глобальной области.

Функция getJSON (по документации jQuery здесь http://api.jquery.com/jQuery.getJSON/ ) является сокращением для:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

поэтому вы хотели бы сделать свой звонок так:

$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success,
  timeout: 15000
});

$('.loadingDiv')
    .hide()
    .ajaxStart(function() {
        $(this).fadeIn();
    })
    .ajaxStop(function() {
        $(this).fadeOut();
    });
1
добавлено

Я не думаю, что любой из этих ответов идеален. Я знаю, что это уже много лет, но то, что вы хотите сделать, это использовать параметры обратного вызова успеха/ошибки метода .ajax (); при получении ответа JSONP.

Пример того, как я буду структурировать это:

   //Call
    $.ajax({

     //URL you want to get
      url: 'http://example.com/json?callback=?',

     //Set a realistic time in milliseconds
      timeout: 3000,

     //Put in success callback function here, this example
     //shows you the data you got back from the call
      success: function(data) {
        console.log(data);
      },

     //Put in an error handling function, just an alert in this case
      error: function(badData) {
        alert('The call was unsuccessful');
      },

      type: 'POST'
    });
0
добавлено