Używam $http
w AngularJs i nie jestem pewien, jak używać zwróconej obietnicy i radzić sobie z błędami.
Mam ten kod:
$http
.get(url)
.success(function(data) {
// Handle data
})
.error(function(data, status) {
// Handle HTTP error
})
.finally(function() {
// Execute logic independent of success/error
})
.catch(function(error) {
// Catch and handle exceptions from success/error/finally functions
});
Czy to dobry sposób, czy jest łatwiejszy sposób?
success()
,error()
afinally()
w połączeniu zcatch()
? Czy też muszę użyćthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);
success
ierror
(wolisz.then
i.catch
zamiast tego możesz (i powinieneś) pominąćerrorFunction
w.then
użyciu ac,catch
jak w moim kodzie powyżej).success
/error
? Również moje Eclipse wpada w amok, kiedy widzi.catch(
, więc["catch"](
na razie używam . Jak mogę oswoić Eclipse?.success
i.error
, $ http zwraca $ q obietnicę z dodatkiem tychsuccess
ierror
koparki - jednak te koparki nie łańcuch i generalnie należy unikać, jeśli / kiedy to możliwe. Ogólnie - jeśli masz pytania, najlepiej zadaj je jako nowe pytanie, a nie jako komentarz do starego.Zapomnij o używaniu
success
ierror
metodzie.Obie metody zostały wycofane w wersji kątowej 1.4. Zasadniczo powodem wycofania jest to, że nie są one przyjazne dla łańcuchów , że tak powiem.
Dzięki poniższym przykładzie postaram się wykazać, co mam na myśli około
success
ierror
jest nie chainable w obsłudze . Załóżmy, że wywołujemy API, które zwraca obiekt użytkownika o adresie:Obiekt użytkownika:
Zadzwoń do API:
Co się stało?
Ponieważ
success
ierror
zwraca pierwotną obietnicę , tj. Tę zwróconą przez$http.get
, obiekt przekazany do wywołania zwrotnegothen
jest całym obiektem użytkownika , to znaczy tym samym wejściem do poprzedniegosuccess
wywołania zwrotnego.Gdybyśmy połączyli dwa łańcuchy
then
, byłoby to mniej zagmatwane:źródło
success
ierror
są dodawane tylko do natychmiastowego powrotu do$http
rozmowy (nie prototyp), więc jeśli zadzwonisz inny sposób obietnica między nimi (jak, zwykle nazywamyreturn $http.get(url)
zawinięte w bibliotece bazowej, ale później zdecydujesz się przełączyć pokrętło w wywołanie biblioteki zreturn $http.get(url).finally(...)
), nie będziesz już mieć tych wygodnych metod.Myślę, że poprzednie odpowiedzi są poprawne, ale oto inny przykład (tylko fyi, success () i error () są przestarzałe zgodnie ze stroną główną AngularJS :
źródło
Jakiego rodzaju szczegółowości szukasz? Zwykle możesz sobie poradzić z:
Odkryłem, że „nareszcie” i „złapanie” są lepsze, gdy wiąże się wiele obietnic.
źródło
loading = false
).catch()
metodzieW przypadku Angular $ http funkcje success () i error () będą miały obiekt odpowiedzi rozpakowany, więc sygnatura wywołania zwrotnego będzie wyglądać następująco: $ http (...). Success (function (data, status, headers, config))
dla then () prawdopodobnie zajmiesz się surowym obiektem odpowiedzi. takie jak opublikowane w dokumencie API AngularJS $ http
Ostatni .catch (...) nie będzie potrzebny, chyba że w poprzednim łańcuchu obietnic pojawi się nowy błąd.
źródło
Robię to tak, jak sugeruje Bradley Braithwaite na swoim blogu :
Jest dość stabilny i bezpieczny, a jeśli masz inne warunki, aby odrzucić obietnicę, zawsze możesz filtrować swoje dane w funkcji sukcesu i dzwonić
deferred.reject(anotherReason)
z przyczyną odrzucenia.Jak zasugerował Ryan Vice w komentarzach , może to nie być postrzegane jako przydatne, chyba że będziesz trochę bawić się odpowiedzią, że tak powiem.
Ponieważ
success
ierror
są przestarzałe od wersji 1.4, być może lepiej jest użyć zwykłych metod obietnicythen
icatch
i przekształcenia odpowiedzi w tych metodach i powrócić obietnicę tej przekształconej odpowiedzi.Pokazuję ten sam przykład z obydwoma podejściami i trzecim podejściem pośrednim:
success
ierror
podejdź (success
ierror
zwróć obietnicę odpowiedzi HTTP, więc potrzebujemy pomocy,$q
aby zwrócić obietnicę danych):then
icatch
podejście (jest to trochę trudniejsze do przetestowania ze względu na rzut):Istnieje jednak rozwiązanie połowiczne (w ten sposób możesz uniknąć,
throw
a mimo to prawdopodobnie będziesz musiał użyć,$q
aby kpić z obiecującego zachowania w swoich testach):Wszelkie uwagi i poprawki są mile widziane.
źródło
success()
ierror()
nie zwróci nowej obietnicy, jak tothen()
robi. Dzięki temu$q
nasza fabryka zwraca obietnicę danych zamiast obietnicy odpowiedzi HTTP.