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

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

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

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

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

Джеймс
источник
2
Тебе нужна ,там после }.
pimvdb
2
взгляните на это> stackoverflow.com/questions/12930759/…
Бахрам
1
возможный дубликат установки тайм-аута jQuery $ .ajax
nathanchere

Ответы:

329

Пожалуйста, прочитайте $.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)опции. Возможные варианты: «timeout», «error», «abort» и «parsererror».

Intelekshual
источник
4
о перехвате ошибки тайм-аута stackoverflow.com/questions/3543683/…
Adrien Be
1
Похоже, что это не работает для меня, тайм-аут: 1, подтвердил, что он прошел, просто никогда не выходит
PandaWood
Обязательно оберните весь вызов $ .ajax с помощью try / catch. Прерывания не перехватываются jQuery и будут выбрасываться вне вызова $ .ajax.
justdan23
112

Вот несколько примеров, которые демонстрируют установку и обнаружение таймаутов в старой и новой парадигмах 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), строка, описывающая тип возникшей ошибки и необязательный объект исключения, если таковой произошел. Возможные значения для второго аргумента (кроме нуля): «timeout», «error», «abort» и «parsererror». При возникновении ошибки HTTP errorThrown получает текстовую часть состояния HTTP, например «Не найдено» или «Внутренняя ошибка сервера». Начиная с jQuery 1.5, установка ошибки может принимать массив функций. Каждая функция будет вызываться по очереди. Примечание. Этот обработчик не вызывается для междоменных сценариев и запросов JSONP.

источник: http://api.jquery.com/jQuery.ajax/

Брэндон Бун
источник
Какая разница между $.ajax().fail()а $.ajax().error()?
Алехандро Гарсия Иглесиас
1
@GarciaWebDev - см. Призыв к jquery ajax - .fail vs.: ошибка
Брэндон Бун
3
+1 за включение jQuery 1.8+. Большинство других ответов на подобные вопросы включают только успех / ошибку от <.
brandonscript
22

Вы можете использовать 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/a/3543713/1689451 для примера.

без тестирования, просто объединяя ваш код с упомянутым 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);
        }
    }
});​
Рудольф Мюльбауэр
источник
H-Bahrami и Rudolf Mühlbauer спасибо за ответ, но я новичок в ajax, поэтому, пожалуйста, уточните мой код ... потому что я уже видел этот ответ, но я не знаю, что происходит ... поэтому, пожалуйста, помогите мне ...
как я могу сделать через .load ()? Это возможно или нет?
@SS, попробуйте найти тайм-аут в документации о загрузке: api.jquery.com/load - и в моем коде была опечатка, исправленная.
Рудольф Мюльбауэр