2013-03-04 21 views
5

Supponiamo che io sono una chiamata un po 'a lungo in esecuzione jQuery Ajax (diciamo 5 secondi) come segue:Come sapere se JQuery errore significa chiamata è stata interrotta

$.ajax({ 
    url: '/LongCall', 
    type: 'POST', 
    async: true, 
    cache: false, 
    datatype: 'json', 
    success: function(data) { 
     alert('Success!'); 
    }, 
    error(xhr, textStatus, errorThrown) { 
     alert('Error!'); 
    } 
}); 

Ora supponiamo durante l'attesa per i miei cinque secondo processo per l'esecuzione l'utente diventa impaziente e decide di raggiungere una sorta di navigazione sulla mia pagina. Quello che succede nella chiamata sopra è che l'utente riceve l'avviso di errore quando fa clic su un collegamento.

Voglio che venga visualizzato l'avviso di errore se c'è davvero un errore, ma se tutto ciò che è successo è che l'utente ha deciso di allontanarsi, non voglio che venga visualizzato l'avviso di errore. Come posso fare questo?

In altre parole, c'è qualche valore che posso controllare (xhr.status forse?) Che mi dirà che l'errore che si è verificato è semplicemente che il processo è stato interrotto, quindi posso sapere di ignorare l'errore?

Grazie!

+1

Controllare il secondo e il terzo argomento della richiamata di errore. –

+0

Il secondo argomento è "errore". Il terzo argomento è "". Né è utile in questo caso da quello che posso dire. –

+0

In tal caso, esaminare le proprietà del primo argomento. –

risposta

8

Vicino come posso dire, il modo migliore per farlo è quello di verificare xhr.readyState nella vostra gestore degli errori. Qualsiasi valore inferiore a 4 indica che il processo è ancora in esecuzione, quindi ciò significa che qualcosa sta accadendo nel browser per interromperlo.

Si desidera anche chiamare xhr.abort() per tentare di interrompere il processo ajax in modo che l'utente non debba attendere il termine prima che la navigazione avvenga effettivamente, anche se per me la chiamata a xhr.abort () in realtà non accelera le cose.

$.ajax({ 
    url: '/LongCall', 
    type: 'POST', 
    async: true, 
    cache: false, 
    datatype: 'json', 
    success: function(data) { 
     alert('Success!'); 
    }, 
    error(xhr, textStatus, errorThrown) { 
     if (xhr.readyState < 4) { 
      xhr.abort(); 
     } 
     else { 
      alert('Error!'); 
     } 
    } 
}); 
3

Leggendo la documentation, vorrei azzardare un'ipotesi che il gestore degli errori dovrebbe essere simile a questo:

error(xhr, textStatus, errorThrown) { 
    if(textStatus != "abort") { 
     alert("Error!"); 
    } 
} 
+0

Questo è quello che pensavo anch'io, ma in realtà se controllo lo stato è "errore" quando l'errore è un'interruzione. –

+0

Cosa dice 'errorThrown'? –

+0

Vedi sopra. È una stringa vuota. –

Problemi correlati