Imposta timeout per ajax (jQuery)


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

A volte la successfunzione funziona bene, a volte no.

Come posso impostare il timeout per questa richiesta Ajax? Ad esempio, 3 secondi, se il tempo è scaduto, quindi mostrare un errore.

Il problema è che la richiesta Ajax blocca il blocco fino al termine. Se il server è inattivo per un po 'di tempo, non finirà mai.


2
Hai bisogno di un ,lì dopo il }.
pimvdb,

2
dai un'occhiata a questo> stackoverflow.com/questions/12930759/…
Bahram,

Risposte:


329

Si prega di leggere la $.ajax documentazione , questo è un argomento trattato.

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

Puoi vedere quale tipo di errore è stato generato accedendo al parametro textStatus error: function(jqXHR, textStatus, errorThrown)dell'opzione. Le opzioni sono "timeout", "errore", "abort" e "parsererror".


4
per quanto riguarda l'errore di timeout di cattura stackoverflow.com/questions/3543683/…
Adrien Be

1
Sembra che non funzioni per me, timeout: 1, ha confermato che è stato superato, ma non è mai scaduto
PandaWood

Assicurati di avvolgere l'intera chiamata $ .ajax con un tentativo / cattura. Gli aborti non vengono catturati da jQuery e verranno lanciati al di fuori della chiamata $ .ajax.
justdan23,

112

Ecco alcuni esempi che dimostrano l'impostazione e il rilevamento dei timeout nei paradigmi vecchi e nuovi di jQuery.

Live Demo

Promettilo 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 <= 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
});

Si noti che il parametro textStatus (o jqXHR.statusText ) ti farà sapere qual è stato l'errore. Ciò può essere utile se si desidera sapere che l'errore è stato causato da un timeout.

errore (jqXHR, textStatus, errorThrown)

Una funzione da chiamare se la richiesta fallisce. La funzione riceve tre argomenti: l'oggetto jqXHR (in jQuery 1.4.x, XMLHttpRequest), una stringa che descrive il tipo di errore che si è verificato e un oggetto facoltativo di eccezione, se presente. I valori possibili per il secondo argomento (oltre a null) sono "timeout", "errore", "abort" e "parsererror". Quando si verifica un errore HTTP, errorThrown riceve la parte testuale dello stato HTTP, ad esempio "Non trovato" o "Errore interno del server". A partire da jQuery 1.5, l'impostazione dell'errore può accettare una serie di funzioni. Ogni funzione verrà chiamata a turno. Nota: questo gestore non viene chiamato per le richieste di script e domini tra domini.

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


Qual è la differenza tra $.ajax().fail()e $.ajax().error()?
Alejandro García Iglesias,


3
+1 per l'inclusione di jQuery 1.8+. La maggior parte delle altre risposte a domande simili include solo successo / errore di <.
brandonscript,

22

È possibile utilizzare l' timeoutimpostazione nelle opzioni ajax in questo modo:

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

Leggi tutto sulle opzioni ajax qui: http://api.jquery.com/jQuery.ajax/

Ricordare che quando si verifica un timeout, il errorgestore viene attivato e non ilsuccess gestore gestore :)


2

utilizzare la .ajaxfunzione jQuery con funzionalità complete . confrontare con https://stackoverflow.com/a/3543713/1689451 per un esempio.

senza test, basta unire il codice con la domanda SO a cui si fa riferimento:

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 e Rudolf Mühlbauer grazie per la risposta, ma sono nuovo in Ajax, quindi per favore chiarisci il mio codice ... perché ho già visto queste risposte ma non so cosa sta succedendo ... per favore aiutami ...

come posso fare attraverso .load ()? È possibile o no?

@SS, prova a cercare il timeout nella documentazione di caricamento: api.jquery.com/load - e ho avuto un refuso nel mio codice, corretto.
Rudolf Mühlbauer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.