Estou usando $http
em AngularJs e não tenho certeza de como usar a promessa retornada e como lidar com erros.
Eu tenho este código:
$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
});
Essa é uma boa maneira de fazer isso ou existe uma maneira mais fácil?
success()
,error()
efinally()
combinado comcatch()
? Ou eu tenho que usarthen(successFunction, errorFunction).catch(exceotionHandling).then(cleanUp);
success
eerror
(de preferência.then
e.catch
em vez disso, você pode (e deve) omitir oerrorFunction
do.then
ac usocatch
como no meu código acima).success
/error
? Além disso, meu Eclipse fica louco quando vê o.catch(
, então eu uso["catch"](
por agora. Como posso domar o Eclipse?.success
e.error
, $ http retorna uma promessa $ q com a adição dos manipuladoressuccess
eerror
- no entanto, esses manipuladores não são encadeados e geralmente devem ser evitados se / quando possível. Em geral - se você tiver dúvidas, é melhor fazer como uma pergunta nova e não como um comentário sobre uma pergunta antiga.Esqueça sobre o uso
success
eerror
método.Ambos os métodos foram descontinuados no angular 1.4. Basicamente, o motivo da reprovação é que eles não são compatíveis com cadeias , por assim dizer.
Com o exemplo a seguir, vou tentar demonstrar o que quero dizer sobre
success
eerror
não sendo chainable-friendly . Suponha que chamemos uma API que retorna um objeto de usuário com um endereço:Objeto do usuário:
Chamada para a API:
O que aconteceu?
Porque
success
eerror
retornar a promessa original , ou seja, aquela retornada por$http.get
, o objeto passado para o retorno de chamada dethen
é o objeto de usuário inteiro , ou seja, a mesma entrada para osuccess
retorno de chamada anterior .Se tivéssemos encadeado dois
then
, isso teria sido menos confuso:fonte
success
eerror
são adicionados apenas ao retorno imediato da$http
chamada (não ao protótipo), então se você chamar outro método de promessa entre eles (como, você normalmente chamareturn $http.get(url)
empacotado em uma biblioteca base, mas depois decide alternar um spinner em a chamada da biblioteca comreturn $http.get(url).finally(...)
), você não terá mais esses métodos de conveniência.Acho que as respostas anteriores estão corretas, mas aqui está outro exemplo (apenas um fyi, success () e error () estão obsoletos de acordo com a página principal do AngularJS :
fonte
Que tipo de granularidade você está procurando? Normalmente, você pode sobreviver com:
Descobri que "finalmente" e "pegar" são melhores quando encadeamos várias promessas.
fonte
loading = false
).catch()
MétodoNo caso de $ http Angular, as funções success () e error () terão o objeto de resposta desembrulhado, de modo que a assinatura de retorno de chamada seria como $ http (...). Success (function (data, status, headers, config))
para then (), você provavelmente lidará com o objeto de resposta bruto. como postado no documento de API $ http do AngularJS
O último .catch (...) não será necessário, a menos que haja um novo erro na cadeia de promessa anterior.
fonte
Eu faço isso como Bradley Braithwaite sugere em seu blog :
É bastante estável e seguro e se tiver outras condições para rejeitar a promessa pode sempre filtrar os seus dados na função de sucesso e ligar
deferred.reject(anotherReason)
com o motivo da rejeição.Como Ryan Vice sugeriu nos comentários , isso pode não ser visto como útil, a menos que você altere um pouco a resposta, por assim dizer.
Porque
success
eerror
são obsoletas desde 1.4 talvez seja melhor usar os métodos promessa regularesthen
ecatch
e transformar a resposta dentro desses métodos e retornar a promessa de que a resposta transformado.Estou mostrando o mesmo exemplo com ambas as abordagens e uma terceira abordagem intermediária:
success
eerror
abordagem (success
eerror
retornar uma promessa de uma resposta HTTP, portanto, precisamos da ajuda de$q
para retornar uma promessa de dados):then
ecatch
abordagem (isso é um pouco mais difícil de testar, por causa do lançamento):Porém, há uma solução intermediária (desta forma, você pode evitar o
throw
e, de qualquer forma, provavelmente precisará usar$q
para simular o comportamento de promessa em seus testes):Qualquer tipo de comentários ou correções são bem-vindos.
fonte
success()
eerror()
não retornaria uma nova promessa comothen()
faz. Com$q
, fazemos nossa fábrica retornar uma promessa de dados em vez de uma promessa de uma resposta HTTP.