Establecer tiempo de espera para ajax (jQuery)


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

A veces success la función funciona bien, a veces no.

¿Cómo establezco el tiempo de espera para esta solicitud ajax? En el ejemplo, 3 segundos, si se agota el tiempo, muestra un error.

El problema es que la petición ajax congela el bloque hasta que termina. Si el servidor está apagado por un poco de tiempo, nunca terminará.

Author: Brandon Boone, 2011-03-08

4 answers

Por favor, lea el $.ajax documentación, este es un tema cubierto.

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

Puede ver qué tipo de error se produjo accediendo al parámetro textStatus de la opción error: function(jqXHR, textStatus, errorThrown). Las opciones son" timeout"," error"," abort "y"parsererror".

 260
Author: Intelekshual,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-07 21:53:24

Aquí hay algunos ejemplos que demuestran establecer y detectar tiempos de espera en los viejos y nuevos paradigmas de jQuery.

Demostración En Vivo

Promise con 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

$.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
});

Observe que el textStatus param (o jqXHR.statusText) le permitirá saber cuál fue el error. Esto puede ser útil si desea saber que el fallo fue causado por un tiempo de espera.

Error (jqXHR, textStatus, errorThrown)

Una función a ser llamada si el la solicitud falla. La función recibe tres argumentos: El jqXHR (en jQuery 1.4.x, XMLHttpRequest), una cadena que describe el tipo de error que se produjo y un objeto de excepción opcional, si se produjo uno. Los valores posibles para el segundo argumento (además de null) son " timeout", "error", "abort", y "parsererror". Cuando se produce un error HTTP, errorThrown recibe la porción textual del estado HTTP, como "No Encontrado" o " Error Interno del Servidor."A partir de jQuery 1.5, el error la configuración puede aceptar una matriz de funciones. Cada función será llamada a su vez. Nota: Este manejador no es llamado para script entre dominios y Peticiones JSONP.

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

 96
Author: Brandon Boone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 14:13:37

Puedes usar la configuración timeout en las opciones de ajax así:

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

Lea todo sobre las opciones de ajax aquí: http://api.jquery.com/jQuery.ajax /

Recuerde que cuando se produce un tiempo de espera, se activa el controlador error y no el controlador success:)

 18
Author: Martin Jespersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-07 21:42:50

Utilice la función completa de jQuery .ajax. comparar con https://stackoverflow.com/a/3543713/1689451, por ejemplo.

Sin probar, simplemente fusiona tu código con la pregunta SO referenciada:

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);
        }
    }
});​
 2
Author: Rudolf Mühlbauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:58