Установить таймаут для ajax (jQuery)

132
$.ajax({
    url: "test.html",
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

Иногда функция success работает хорошо, иногда нет.

Как установить таймаут для этого запроса ajax? В примере, 3 секунды, если время отсутствует, затем покажите ошибку.

Проблема заключается в том, что запрос ajax блокирует блок до завершения. Если сервер не работает в течение короткого времени, он никогда не закончится.

Показать ещё 1 комментарий

4 ответа

204
Лучший ответ

Прочтите $.ajax документацию, это охваченная тема.

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

Вы можете увидеть, какой тип ошибки был сброшен, обратившись к параметру textStatus параметра error: function(jqXHR, textStatus, errorThrown). Возможные значения: "тайм-аут", "ошибка", "прервать" и "parsererror".

  • 3
    о перехвате ошибки тайм-аута stackoverflow.com/questions/3543683/…
  • 1
    Просто, похоже, не работает для меня, тайм-аут: 1, подтвердил, что он прошел, просто никогда не выходит
91

Вот несколько примеров, демонстрирующих установку и обнаружение тайм-аутов в старых и новых парадигмах jQuery.

Live Demo

Обещать с помощью jQuery 1.8 +

Promise.resolve(
  $.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
  })
).then(function(){
  //do something
}).catch(function(e) {
  if(e.statusText == 'timeout')
  {     
    alert('Native Promise: Failed from timeout'); 
    //do something. Try again perhaps?
  }
});

jQuery 1.8 +

$.ajax({
    url: '/getData',
    timeout:3000 //3 second timeout
}).done(function(){
    //do something
}).fail(function(jqXHR, textStatus){
    if(textStatus === 'timeout')
    {     
        alert('Failed from timeout'); 
        //do something. Try again perhaps?
    }
});​

jQuery <= 1.7.2

$.ajax({
    url: '/getData',
    error: function(jqXHR, textStatus){
        if(textStatus === 'timeout')
        {     
             alert('Failed from timeout');         
            //do something. Try again perhaps?
        }
    },
    success: function(){
        //do something
    },
    timeout:3000 //3 second timeout
});

Обратите внимание, что параметр textStatus (или jqXHR.statusText) позволит вам узнать, что произошло. Это может быть полезно, если вы хотите знать, что отказ был вызван таймаутом.

ошибка (jqXHR, textStatus, errorThrown)

Функция, вызываемая, если запрос не выполняется. Функция получает три аргумента: jqXHR (в jQuery 1.4.x, XMLHttpRequest), строка, описывающая тип произошла ошибка и дополнительный объект исключения, если он произошел. Возможные значения для второго аргумента (кроме нуля) - это "тайм-аут", "error", "abort" и "parsererror". Когда возникает ошибка HTTP, errorThrown получает текстовую часть статуса HTTP, например "Не найдено" или "Внутренняя ошибка сервера". Начиная с jQuery 1.5, ошибка настройка может принимать множество функций. Каждая функция будет называться в очереди. Примечание. Этот обработчик не вызывается для междоменного script и Запросы JSONP.

src: http://api.jquery.com/jQuery.ajax/

  • 0
    В чем разница между $.ajax().fail() и $.ajax().error() ?
  • 1
    @GarciaWebDev - см. Призыв к jquery ajax - .fail vs.: ошибка
Показать ещё 1 комментарий
16

Вы можете использовать параметр timeout в параметрах ajax, например:

$.ajax({
    url: "test.html",
    timeout: 3000,
    error: function(){
        //do something
    },
    success: function(){
        //do something
    }
});

Читайте все о параметрах ajax здесь: http://api.jquery.com/jQuery.ajax/

Помните, что когда происходит тайм-аут, обработчик error запускается, а не обработчик success:)

2

используйте полнофункциональную функцию .ajax jQuery. сравните с https://stackoverflow.com/questions/3543683/determine-if-ajax-error-is-a-timeout для примера.

без тестирования, просто слияние вашего кода с указанным вопросом SO:

target = $(this).attr('data-target');

$.ajax({
    url: $(this).attr('href'),
    type: "GET",
    timeout: 2000,
    success: function(response) { $(target).modal({
        show: true
    }); },
    error: function(x, t, m) {
        if(t==="timeout") {
            alert("got timeout");
        } else {
            alert(t);
        }
    }
});​
  • 0
    H-Bahrami и Rudolf Mühlbauer спасибо за ответ, но я новичок в ajax, поэтому, пожалуйста, уточните мой код ... потому что я уже видел этот ответ, но я не знаю, что происходит ... поэтому, пожалуйста, помогите мне ...
  • 0
    спасибо но это не работает ..
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню