2010-12-11 13 views
34

Który ma być używany w tym czasie.jquery :: ajaxStop() versus jquery :: ajaxComplete()

w dokumentacji http://api.jquery.com/:

Dla ajaxStop() mówi:

Opis: Zarejestruj obsługi zostać wywołana, gdy wszystkie żądania Ajax zakończyły. To jest wydarzenie Ajax.

A dla ajaxComplete() mówi:

Opis: Zarejestruj obsługi do wywołania kiedy żądania Ajax kompletne. To jest wydarzenie Ajax.

Z tego co widzę ajaxComplete() jest bardziej elastyczna z uwagi na:

Wszystkie ajaxComplete teleskopowe są wywoływane, niezależnie od żądania Ajax została zakończona. Jeśli musimy rozróżnić żądania, możemy użyć parametrów przekazanych do obsługi. Za każdym razem, gdy wykonywana jest procedura obsługi ajaxComplete, przekazywany jest obiekt zdarzenia, obiekt XMLHttpRequest i obiekt ustawień, który został użyty podczas tworzenia żądania.

Czy ktoś może wyjaśnić, za co każdy jest i odpowiednie użycie dla każdego. W aplikacji, którą ostatnio zbudowałem, polegałem na ajaxStop(), aby uruchamiać się po zakończeniu wywołań ajax. Następnie przeanalizowałbym zwrócone dane dla wyniku operacji po stronie serwera. Teraz zaczynam się zastanawiać, czy powinienem używać ajaxComplete() zamiast lub kombinacji obu dla różnych sytuacji.

Myśli są doceniane.

+0

Nie mogłem dowiedzieć się, dlaczego otrzymuję błąd "ajaxComplete nie jest funkcją". Pamiętaj, aby nie używać "szczupłej" wersji jQuery: https://stackoverflow.com/a/35424465/470749 – Ryan

Odpowiedz

54

Cóż, krótka wersja jest służą różnym celom, więc odpowiedź będzie „kombinacja obu różnych sytuacjach” opcja. Podstawowe zasady to:

  • .ajaxComplete() - trwa każde żądanie że zakończy, należy użyć, gdy chcesz coś zrobić z każdym żądaniem/rezultatu. Zauważ, że nie zastąpi to procedury obsługi success, ponieważ przetwarzane dane nie są jednym z argumentów (i działają nawet wtedy, gdy wystąpił błąd) - możesz zamiast tego chcieć .ajaxSuccess() w niektórych sytuacjach na żądanie.
  • .ajaxStop() - biegnie po każda partia wniosków uzupełnia, zwykle chcesz to wykorzystać w połączeniu z .ajaxStart() rzeczy jak pokazywanie/ukrywanie „Loading ...” wskaźnik pewnego rodzaju - lub zrobić coś innego raz partia żądań AJAX kończy się, jak ostatni mistrzowski krok.

Jeśli używasz tego do analizowania danych, nie ma chyba lepszego sposobu, w tym przypadku $.ajaxSetup(), gdzie można określić success obsługi że dostaje już przeanalizowane dane (np Odpowiedzi JSON będzie obiektów) , tak:

$.ajaxSetup({ 
    success: function(data) { 
    //do something with data, for JSON it's already an object, etc. 
    } 
}); 
+0

Otrzymuję wywołanie sukcesu ajax. Kiedy powinienem użyć ajaxStop versus complete. – Chris

+8

@Chris - '.ajaxStop()' uruchamia się, gdy partia żądań jest kompletna, co oznacza, że ​​jeśli wystrzelisz 5, niezależnie od tego, w jakiej kolejności wróci, zostanie wywołana, gdy piąty zostanie uruchomiony, więc nie ma żądań AJAX czekających na wyniki w tym momencie skończyłeś. Oznacza to, że nie ma żadnych informacji o konkretnym żądaniu, które zostało ukończone, ponieważ nie było * dla * żądania, dotyczyło to wszystkich. 'ajaxComplete' uruchamia * żądanie * każdego, z obiektem' XMLHttpRequest' dla każdego ... tak, że masz trochę informacji o żądaniu, z którym musisz sobie poradzić ... wszystko zależy od tego, co faktycznie robisz, co do tego, które jest odpowiednie. . –

+0

Dzięki, to ma sens. – Chris

7

ajaxComplete jest wywoływana, gdy żądanie ajax zakończy się pomyślnie lub z błędem.

ajaxStop jest wywoływana po wypełnieniu wszystkich żądań ajax dla wszystkich. W przeciwieństwie do ajaxComplete, nie zostanie wywołany, jeśli wciąż trwa żądanie.

Powinieneś użyć pierwszego, jeśli operacja, którą chcesz wykonać, powinna być wykonana dla każdego żądania ajax.

3

Ogólnie rzecz biorąc, chcesz użyć ajaxComplete. Wynika to z tego, że ajaxStop zostanie wywołany tylko wtedy, gdy nie będzie już żądań powrotu do kolejnych żądań ajaxowych. To może nie wyglądać inaczej, gdy wysyłasz jedno zapytanie ajaxowe na raz, ale wyobraź sobie, że sieć zwolniła po wysłaniu żądania A, a gdy żądanie B zostanie wysłane 5 sekund później, wróci wcześniej niż żądanie A .. następnie ajaxStop zostanie wyzwolony tylko raz po żądaniu A powróci, podczas gdy ajaxComplete będzie strzelać za każdym razem.

Sytuacja, w której można użyć ajaxStop, polega na wysyłaniu wielu żądań ajaxowych za jednym zamachem ... złożyć serię 3 formularzy ... i chcesz otrzymywać powiadomienia, gdy wszystkie 3 zostaną pomyślnie zakończone. Oczywiście można uzyskać tę samą funkcjonalność z licznikiem w ramach ajaxComplete

Jednak z dźwięków twojego pytania ... chciałbyś parsować dane z każdej odpowiedzi ajax ... zazwyczaj robiono to w wywołanie zwrotne ajax, np

$.ajax({ 
    url: "blah", 
    data: "blah", 
    success: function (data) { /* Code in here */ } 
});