Zgodnie z dokumentem AngularJS wezwania do $http
zwrotu następujących elementów:
Zwraca obiekt obietnicy ze standardową metodą then i dwiema metodami specyficznymi dla http: sukces i błąd . Metoda then przyjmuje dwa argumenty jako sukces i wywołanie zwrotne błędu, które zostanie wywołane z obiektem odpowiedzi. Metody sukcesu i błędu pobierają jeden argument - funkcję, która zostanie wywołana, gdy żądanie zakończy się sukcesem lub niepowodzeniem. Argumenty przekazane do tych funkcji są zniszczoną reprezentacją obiektu odpowiedzi przekazanego do metody then.
Pomijając fakt, że response
obiekt jest zniszczony w jednym przypadku, nie widzę różnicy między
- powodzenie / błąd wywołania zwrotne przekazane do przekazania jako argumenty programu
promise.then
- wywołania zwrotne przekazane jako argumenty metod
promise.success
/promise.error
obietnicy
Czy jest jakiś? Jaki jest sens tych dwóch różnych sposobów przekazywania pozornie identycznych wywołań zwrotnych?
then
wywołania zwrotne ma jeden argument - odpowiedź - podczassuccess
ierror
wziąć poszczególnych składników odpowiedzi jako arguments--data
,status
,header
, iconfig
..success()
metoda zwraca oryginalny obiekt obietnicy $ http, ponieważ łańcuch$http(...).success(...).error(...)
jest możliwy. Jeśli, co wydaje się rozsądne, odwrotność$http(...).error(...).success(...)
jest również możliwa,.error()
należy również zwrócić oryginalny obiekt obietnicy. Różnica.then()
polega na tym, że zwraca nową obietnicę.promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
success
został wycofany. Od docs.angularjs.org/api/ng/service/$http#deprecation-noticeThe $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.
Jest tu już kilka dobrych odpowiedzi. Ale warto wyjaśnić różnicę w oferowanej równoległości:
success()
zwraca pierwotną obietnicęthen()
zwraca nową obietnicęRóżnica polega na
then()
sterowaniu sekwencyjnymi operacjami, ponieważ każde wywołanie zwraca nową obietnicę.$http.get()
seqFunc1()
seqFunc2()
success()
steruje operacjami równoległymi, ponieważ programy obsługi są połączone łańcuchami według tej samej obietnicy.$http.get()
parFunc1()
,parFunc2()
Równolegleźródło
then
osiągnięciu a powoduje zniknięcie metodsuccess
ierror
. Również dla http reakcje na błędy (np 404) pierwszythen
whttp.then(ok, err).then(ok, err)
przejdzie doerr
obsługi, ale następujące z nich przejdzie dook
obsługi. Zasadniczohttp.success().error().success().error()
można łączyć w łańcuchy, ale obietnice $ q są zupełnie inne, ponieważ dotyczą obietnic i konkretnej kolejności obsługi (a nie obsługi żądań http). Trudno mi było to zrozumieć, dopóki nie przyjrzałem się bliżej.success
ierror
nie są normalnym API obietnicy, są przykręcone do zwracanej wartości $ http ().success
wykona się po wykonaniu pierwszego, ale zanim zwrócona z niego obietnica zostanie rozwiązana, podczas gdy drugathen
będzie czekać. Jeśli nie składasz obietnic, oboje zachowują się tak samo.Kilka przykładów kodu dla prostego żądania GET. Może to pomoże zrozumieć różnicę. Używając
then
:Używanie
success
/error
:źródło
data,status,header,config
porównaniu z prostym zwracaniemresponse
?.then () można łączyć w łańcuch i będzie czekać na rozwiązanie metody previousthen ().
.success () i .error () mogą być połączone łańcuchami, ale wszystkie będą odpalać naraz (więc niewiele na to wskazuje)
.success () i .error () są po prostu przydatne w przypadku prostych wywołań (łatwe twórcy):
więc nie musisz wpisywać tego:
Ale generalnie obsługuję wszystkie błędy za pomocą .catch ():
Jeśli potrzebujesz obsługiwać <= IE8, napisz swoje .catch () i .finally () w ten sposób (metody zastrzeżone w IE):
Przykłady robocze:
Oto coś, co napisałem w bardziej kodowym formacie, aby odświeżyć pamięć, jak to wszystko wygląda z obsługą błędów itp:
http://jsfiddle.net/nalberg/v95tekz2/
źródło
Dla uzupełnienia, oto przykład kodu wskazujący różnice:
sukces \ błąd:
następnie:
źródło
Oficjalna uwaga: sukces i błąd zostały wycofane. Zamiast tego użyj standardowej metody then.
link: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http
zrzut ekranu: wyświetl zrzut ekranu
źródło