Встановити тайм-аут для 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/…
Бахрам

Відповіді:


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".


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.

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


Яка різниця між $.ajax().fail()і $.ajax().error()?
Алехандро Гарсія Іглесіас


3
+1, включаючи jQuery 1.8+. Більшість інших відповідей на подібні запитання включають лише успіх / помилку з <.
брендоскрипт

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 дякую за відповідь, але я новачок в аяксі, тому, будь ласка, уточніть через мій код ... тому що я вже бачив цю відповідь, але я не знаю, що відбувається .. тому будь ласка, допоможіть мені ...

як я можу це зробити через .load ()? Можна чи ні?

@SS, спробуйте шукати тайм-аут у документації щодо завантаження: api.jquery.com/load - і у мене був помилка друку в коді.
Рудольф Мюльбауер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.