Czy jest jakiś odpowiednik „wreszcie” w wywołaniach jQuery AJAX?

84

Czy w wywołaniach jQuery AJAX istnieje odpowiednik języka Java? Mam tutaj ten kod. W moim zawsze I wyjątek, jednak zawsze chcę to pójść do następnie () metody.

    call.xmlHttpReq = $.ajax({
        url : url,
        dataType : 'json',
        type : 'GET'
    }).always(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

       throw "something";

    }).then(function() {

        alert("i want to always run no matter what");
    });

Próbowałem użyć done () , complete () , a inny always () , ale wydaje się, że nic nie działa.

Oto JSFiddle:

http://jsfiddle.net/qv3t3L0m/

Oliver Watkins
źródło
po prostu always
dołącz
1
Nie możesz wyłapać asynchronicznie wyrzucanych błędów, bo tego właśnie szukasz. Będziesz musiał sam zawrzeć to w try-catch-finallyoświadczeniu.
Bergi,
3
To zawsze idzie do funkcji zawsze (), to dlaczego jest tak trafnie nazwany.
adeneo,
O ile jQuery nie obsłuży każdego try / catch w wywołaniu zwrotnym, throw "something";po prostu zatrzyma wykonywanie kodu.
plalx
@Bergi, nie jestem zaznajomiony z obietnicami jQuery impl, ale jeśli jest zgodny z Promises / A +, to zgłoszone błędy zostaną przekazane do errorHandler. Więc jeśli przekaże wtedy drugą funkcję, to otrzyma „coś” jako parametr.
David McMullin,

Odpowiedzi:

130

Zobacz ten przykład:

$.ajax({
        type: "GET",
        dataType: dataType,
        contentType: contentType,
        async: TRUE,
        url: $('html form:nth-child(1)').attr('action') + "?" $('html form:nth-child(1)').serialize(),
        success: function(data) {
            console.log("FUNFOU!");
        },
        error: function(data) {
            console.log("NÃO FUNFOU!");
        },
        complete: function(data) {
            console.log("SEMPRE FUNFA!"); 
            //A function to be called when the request finishes 
            // (after success and error callbacks are executed). 
        }
    });

Więcej informacji: http://api.jquery.com/jquery.ajax/

Rafael Gomes Francisco
źródło
27
.complete()został wycofany; użyj .always()teraz. api.jquery.com/jQuery.ajax
mlg
4
Polubiony za czasownik FUNFAR: D
Bruno Rodrigues.
4
Parametr @mlg: complete nie jest przestarzały, wycofali jedynie funkcję zwrotną .complete (), ponieważ teraz obiekty jqXHR implementują interfejs Promise. Zobacz odpowiedź na to pytanie: stackoverflow.com/questions/15821141/…
jeanie77
45

.always()powinno działać. Zobacz sekcję Obiekt jqXHR pod adresem http://api.jquery.com/jQuery.ajax/ .

jqXHR.always (function (data | jqXHR, textStatus, jqXHR | errorThrown) {}); Alternatywna konstrukcja do pełnej opcji wywołania zwrotnego, metoda .always () zastępuje przestarzałą metodę .complete ().

W odpowiedzi na pomyślne żądanie argumenty funkcji są takie same, jak argumenty .done (): data, textStatus i obiekt jqXHR. W przypadku żądań zakończonych niepowodzeniem argumenty są takie same, jak w przypadku .fail (): obiekt jqXHR, textStatus i errorThrown. Szczegóły implementacji znajdziesz w deferred.always ().

Zobacz także http://api.jquery.com/deferred.always/

jrummell
źródło
11

Poniższe sugestie nie będą działać w jQuery, ponieważ implementacja obietnicy jQuery nie obsługuje błędów zgłaszanych w przekazanych do niej metodach. Zostawiam je tutaj tylko jako ilustrację tego, co mogłoby być możliwe, gdyby jQuery było obietnice / zgodne z A +. Jak słusznie zauważa Bergi, będziesz musiał ręcznie zawijać swój kod we własnym bloku try catch.

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).always(function() {

    alert("i want to always run no matter what");
});

Chociaż nie jestem pewien, czy obietnica jquery zawsze obsługuje, alternatywą byłoby użycie następnie (ponownie) i przekazanie tej samej funkcji, co zarówno successHandler, jak i errorHandler, na przykład:

call.xmlHttpReq = $.ajax({
    url : url,
    dataType : 'json',
    type : 'GET'
}).then(function(processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) {

   throw "something";

}).then(function() {

    alert("i want to always run no matter what");
},
function() {

    alert("i want to always run no matter what");
});
David McMullin
źródło
jQuery thennie przechwytuje błędów w wywołaniu zwrotnym. Czy pan spróbować?
Bergi,
przepraszam, próbowałem używać then-> zawsze i mając w swoim wtedy dwie funkcje, ale nadal mam ten sam problem.
Oliver Watkins
najszczersze przeprosiny, po obejrzeniu odroczonych dokumentów jquery pomyślałem, że to zadziała, ale wyraźnie się pomyliłem i Bergi słusznie wskazuje, że powinienem był sprawdzić w piaskownicy.
David McMullin,
3

Tylko uwaga dla tych, którzy używają jQuery 3.0 i nowszych

Uwaga dotycząca wycofania: wywołania zwrotne jqXHR.success (), jqXHR.error () i jqXHR.complete () są usuwane od wersji jQuery 3.0. Zamiast tego można użyć jqXHR.done (), jqXHR.fail () i jqXHR.always ().

Jak w oficjalnej dokumentacji

Jayavardhan Gange
źródło
2

Występuje błąd ajax jest zależny od serwera, najlepiej sprawdzić stan z "zakończony" jest najlepszy, rodzaj "sukcesu", "błędu" a inne nie są w 100% PUT, POST i GET ... zobacz na przykład

$.ajax({
    url: '/api/v2/tickets/123456.json',
    ....
    ....
    ....
    complete: function(data) { 
        if (data.statusText == "success") { 
            console.log("Sent successfully");
        } else { 
            console.log("Not Sent");
        }
    }
});

Przepraszam, zły angielski! Dopingować ;-)

KingRider
źródło
1

jeśli chcesz mieć jedną definicję kodu dla wszystkich żądań Ajax, możesz to zrobić w ten sposób

$(document).ajaxComplete(function () {
    console.log('ajax complete on doc');
})
sairfan
źródło