2013-03-04 8 views
5

Załóżmy, że mam dość długo działa wywołanie jQuery AJAX (powiedzmy 5 sekund) w następujący sposób:Jak stwierdzić, czy JQuery błąd oznacza połączenie zostało przerwane

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

Załóżmy teraz, czekając na moje pięć drugiego procesu uruchomienia użytkownik staje się niecierpliwy i decyduje się na jakąś nawigację na mojej stronie. W powyższym wywołaniu użytkownik otrzymuje komunikat o błędzie po kliknięciu linku.

Chcę, aby wyświetlał się komunikat o błędzie, jeśli rzeczywiście wystąpił błąd, ale jeśli wszystko, co się zdarzyło, to to, że użytkownik zdecydował się odejść, nie chcę wyświetlać komunikatu o błędzie. Jak mogę to zrobić?

Innymi słowy, czy istnieje pewna wartość, którą mogę sprawdzić (xhr.status maybe?), Która powie mi, że wystąpił błąd po prostu, że proces został przerwany, więc mogę wiedzieć, aby zignorować błąd?

Dzięki!

+1

Sprawdź drugi i trzeci argument wywołania błędu. –

+0

Drugi argument to "błąd". Trzecim argumentem jest "". W tym przypadku nie jest to przydatne z tego, co mogę powiedzieć. –

+0

W takim przypadku przejrzyj właściwości pierwszego argumentu. –

Odpowiedz

8

tak blisko, jak mogę powiedzieć, najlepszym sposobem, aby to zrobić, to sprawdzić w swojej xhr.readyState obsługa błędów. Każda wartość mniejsza niż 4 wskazuje, że proces nadal trwa, więc oznacza to, że coś dzieje się w przeglądarce, aby je przerwać.

Należy również wywołać xhr.abort(), aby przerwać proces ajax, aby użytkownik nie musiał czekać na zakończenie, zanim faktycznie nastąpi nawigacja, chociaż dla mnie wywołanie xhr.abort () w rzeczywistości nie przyspiesza rzeczy.

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

Czytając documentation, chciałbym zgadywać, że obsługi błędów powinno być tak:

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

Tak też myślałem, ale tak naprawdę, jeśli sprawdzam status, to "błąd", gdy błąd jest przerwany. –

+0

Co mówi komunikat "errorThrown"? –

+0

Patrz wyżej. To pusty ciąg. –

Powiązane problemy