Czy powinienem używać .done () i .fail () dla nowego kodu jQuery AJAX zamiast sukcesu i błędu

166

Zakodowałem tak:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

Ale kiedy patrzę na .ajax()dokumentację jQuery na końcu, wydaje mi się, że powinienem kodować w ten sposób poniżej lub przynajmniej sugeruje dodanie a .done()i a .fail():

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

request.done(function (data) {
    xxx;
});
request.fail(function (jqXHR, textStatus) {
    xxx;
});

Aktualizacja

Jeśli koduję w ten sposób, czy jest to to samo, czy jest jakaś korzyść z podzielenia go na trzy części?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});
Alan2
źródło

Odpowiedzi:

165

Jak stwierdził użytkownik2246674, użycie successi errorjako parametru funkcji Ajax jest prawidłowe.

Aby zachować zgodność z poprzednią odpowiedzią, czytając dokument:

Powiadomienie o wycofaniu :

Funkcje zwrotne jqXHR.success (), jqXHR.error () i jqXHR.complete () będą przestarzałe w jQuery 1.8. Aby przygotować kod do ostatecznego usunięcia, użyj zamiast tego jqXHR.done (), jqXHR.fail () i jqXHR.always ().

Jeśli korzystasz z funkcji oddzwaniania-manipulacji (metodą-łańcuchowym na przykład), wykorzystywania .done(), .fail()a .always()zamiast success(), error()i complete().

Michael Laffargue
źródło
54
Nie zgadzam się. Odniesienia mówi o funkcje wywołania-manipulacji (np .error, .success), który jest zastąpiona bardziej uniwersalnego Opóźnionej wzoru, ale parametry do ajaxmetody nie są już używane i są obie ważne i akceptowalne - nawet w jQuery 1.9 / 2.0! We wszystkich obecnych formach ajaxnadal zwraca Odroczoną; prawdopodobnie z już dołączonymi odroczonymi wywołaniami zwrotnymi.
user2246674
1
Oto ona, jQuery 1.9 i Success :, error: i complete: są nadal użyteczne. Jednak moje pytanie brzmi: czy .done () == do sukcesu:?
TARKUS
3
@GregoryLewis Od JQuery 1.10 kodu źródłowego: jqXHR.success = jqXHR.done;.
Michael Laffargue,
9
Chciałbym szczerze wolę success, fail, always.
ahnbizcad
4
WOW, źle przeczytałem również dokumentację. Dosłownie myślałem, że opcje „sukces” / „błąd” dla $ .ajax zostały przepisane na „wykonane / niepowodzenie”. To były tylko łańcuchy metod wywołania zwrotnego. Szczerze mówiąc, myślę, że powinni również zmienić nazwy opcji. To sprawiało, że gmatwałem się przez wiele godzin.
OzzyTheGiant
12

Chcę dodać coś do posta @Michael Laffargue:

jqXHR.done() jest szybszy!

jqXHR.success()mają trochę czasu ładowania w wywołaniu zwrotnym i czasami mogą przesadzić ze skryptem. Wcześniej uważam to za trudne.

AKTUALIZACJA:

Używając jqXHR.done(), jqXHR.fail()i jqXHR.always()możesz lepiej manipulować żądaniem Ajax. Ogólnie możesz zdefiniować ajax w jakiejś zmiennej lub obiekcie i użyć tej zmiennej lub obiektu w dowolnej części kodu i szybciej uzyskać dane. Dobry przykład:

/* Initialize some your AJAX function */
function call_ajax(attr){
    var settings=$.extend({
        call            : 'users',
        option          : 'list'
    }, attr );

    return $.ajax({
        type: "POST",
        url: "//exapmple.com//ajax.php",
        data: settings,
        cache : false
    });
}

/* .... Somewhere in your code ..... */

call_ajax({
    /* ... */
    id : 10,
    option : 'edit_user'
    change : {
          name : 'John Doe'
    }
    /* ... */
}).done(function(data){

    /* DO SOMETHING AWESOME */

});
Ivijan Stefan Stipić
źródło
9
Czy masz jakieś wiarygodne i sprawdzalne referencje?
Paul Vargas
@PaulVargas Nigdy nie wykonuję żadnego testu wydajności, ale w mojej praktyce uważam, że to działa. Możesz spróbować samemu.
Ivijan Stefan Stipić
1
Proszę przedstawić wszelkie wiarygodne dowody.
wonsuc
Jak wiesz, funkcje zwrotne są wolniejsze w porównaniu do zwracania niektórych obiektów z funkcji. Czasami ma niewielki wpływ, ale czasami może być ogromny, jeśli masz wiele połączeń.
Ivijan Stefan Stipić
7

W prostych słowach

$.ajax("info.txt").done(function(data) {
  alert(data);
}).fail(function(data){
  alert("Try again champ!");
});

jeśli otrzyma info.text, to ostrzeże i każdą dodaną funkcję lub jeśli w ogóle nie będzie w stanie pobrać info.text z serwera, to funkcja ostrzeżenia lub błędu.

Yasir
źródło
0

Kiedy zamierzamy przeprowadzić migrację JQuery z 1.x do 2x lub 3.x w naszej starej istniejącej aplikacji, użyjemy .done, .fail zamiast powodzenia, błędu, ponieważ JQuery up gradation będzie przestarzałe. Przykładowo, gdy wywołujemy metody sieciowe serwera, serwer zwraca obietnice do metod wywołujących (metody Ajax), a te obietnice zawierają metody .done, .fail..etc. Poniżej znajduje się przykład (dotyczy żądania POST w taki sam sposób, w jaki możemy konstruować dla typu żądania, takiego jak GET ...)

 $.ajax({
            type: "POST",
            url: url,
            data: '{"name" :"sheo"}',
            contentType: "application/json; charset=utf-8",
            async: false,
            cache: false
            }).done(function (Response) {
                  //do something when get response            })
           .fail(function (Response) {
                    //do something when any error occurs.
                });
Sheo Dayal Singh
źródło