2011-09-04 9 views
55

Per quanto tempo il browser può attendere prima che venga visualizzato un errore prima che il server risponda alla richiesta? Può essere questa volta illimitata?Quanto tempo aspetta il browser dopo una richiesta Ajax?

+2

Non sei sicuro di quello che si sta utilizzando, ma sì è possibile estendere il timeout. Per infinito, non lo so. Anche se raccomanderei di non dedicare tempo illimitato. Se è necessario, è sempre possibile impostarlo su qualcosa come 90 secondi o leggermente più lungo. Se ci vogliono più di 30 secondi, probabilmente c'è un modo migliore e più veloce per fare qualcosa. – Matt

+1

+1 - Anche io sono curioso di questo. Sospettavo che tu dovessi preoccuparti del tempo che il cliente avrebbe avuto su di te. Non hai il controllo su questo. Una ricerca su google ha rivelato questo. In pratica dice che il server o il browser possono scadere. Quindi sceglierei qualcosa che il valore predefinito per tutti i browser non supererà. http://support.microsoft.com/kb/813827 – mrtsherman

+0

Durante il debug, una volta sono andato a pranzo dopo la chiamata ajax e sono tornato al browser ancora in attesa della risposta. Ho cliccato sul mio debugger e il browser ha raccolto la risposta. Non penso che questo conti, però, perché stavo eseguendo il debug di –

risposta

62

Se si sta utilizzando una chiamata jQuery $ .ajax, è possibile impostare la proprietà di timeout per controllare la quantità di tempo prima che una richiesta ritorni con uno stato di timeout. Il timeout è impostato in millisecondi, quindi impostalo su un valore molto alto. Puoi anche impostarlo su 0 per "illimitato", ma a mio avviso dovresti semplicemente impostare un valore alto.

Nota: il numero illimitato è actually the default ma la maggior parte dei browser ha un timeout predefinito che verrà colpito.

Quando viene restituita una chiamata ajax a causa del timeout, verrà restituito con uno stato di errore di "timeout" che è possibile gestire con un caso separato, se necessario.

Quindi, se si desidera impostare un timeout di 3 secondi, e gestire il timeout Ecco un esempio:

$.ajax({ 
    url: "/your_ajax_method/", 
    type: "GET", 
    dataType: "json", 
    timeout: 3000, //Set your timeout value in milliseconds or 0 for unlimited 
    success: function(response) { alert(response); }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     if(textStatus==="timeout") { 
      alert("Call has timed out"); //Handle the timeout 
     } else { 
      alert("Another error was returned"); //Handle other error type 
     } 
    } 
});​ 
+5

L'impostazione del valore di timeout su '0' imposta il timeout AJAX su un periodo indefinito (leggi illimitato). – John

+0

@John o nemmeno impostarlo affatto (la lettura 0 è predefinita). –

+0

Ricevo "errore" in textStatus non come "timeout" – UmaShankar

3

Puoi spiegare un po 'di più su cosa stai cercando di ottenere - hai un lungo processo in esecuzione su un server, vuoi modificare le impostazioni solo su una macchina locale o stai cercando un modo per gestire per un grande numero di utenti?

Il tempo di attesa del browser dipende da un numero di fattori, ad es. dove si verifica il timeout - è a livello di TCP, il server o il browser locale?

Se si ha un lungo processo in esecuzione su un server e si desidera aggiornare una pagina Web in seguito, il modo tipico per gestirlo è eseguire il processo lungo in modo asincrono e notificare al client quando è completo, ad es. avere una chiamata ajax che esegue il polling del server o utilizzare HTTP 1.1 e inviare un flusso di notifica al client.

In entrambi i casi è ancora possibile chiudere la connessione in modo che il client abbia ancora bisogno della possibilità di riaprirlo.

14

Sì e no. Sì, il server può farlo o essere configurato per farlo, nessun browser (non sono a conoscenza delle specifiche di versione/distributore) può avere timeout abilitati.

Ci sono 2 soluzioni anche se per il raggiungimento/emulare questo su HTTP:

  • Se questa è la semplice esecuzione di uno script lungo e si sta aspettando i risultati questo non è il modo di andare, si dovrebbe invece fare come precedente poster menzionato e utilizzare l'elaborazione asincrona con il polling del server per i risultati, questa sarebbe una soluzione antincendio molto più sicura. Ad esempio: uno script di anteprima da un lato del processore di immagini: l'utente carica un'immagine che il server restituisce immeditamente 200 e un "ID lavoro". Il client (javascript ^^) può quindi utilizzare JobID per richiedere lo stato/risultato del lavoro.
  • Se il tuo obiettivo è avere qualcosa come una connessione in tempo reale tra browser e server (connessione a 1 via, una volta che la richiesta è stata fatta dal browser non possono essere inviate ulteriori informazioni senza usare nuove richieste (ajax ^^)), questo è chiamato long polling/reverse ajax e può essere utilizzato per la comunicazione in tempo reale su http. Esistono diverse tecniche che utilizzano in parallelo due richieste polled lunghe, in modo che una volta scaduto il secondo si attivi e il primo tenti di riconnettersi.
+1

Grande risposta, grazie –

2

Ho trovato che, in caso di una normale richiesta (pagina HTML), i browser scorrono fino al timeout dopo cca. 30 secondi. È importante, perché probabilmente gli altri partecipanti lo seguono: proxy, router (i router non giocano in questo gioco? Non ne sono sicuro). Sto usando 4 sec ritardo sul lato server (se non c'è nulla da inviare al client), e il mio client AJAX esegue immediatamente un'altra richiesta HTTP (sono su rete locale, non c'è ritardo di Internet). 4 secondi è abbastanza lungo da non sovraccaricare il server e la rete con sondaggi frequentati, ed è abbastanza breve per il caso, quando in qualche modo un sondaggio cade fuori dalla riga che il client non è in grado di rilevare e gestire.

Inoltre, ci sono altri problemi con cometa (richiesta HTTP lunga): limite del browser sul numero di richiesta HTTP simultanea, gestione degli eventi lato client (deve essere inviata immediatamente al server), rilevamento/ripristino del server/rete in discesa , gestione multiutente ecc.