De acordo com o documento do AngularJS , as chamadas para $http
retornar o seguinte:
Retorna um objeto de promessa com o método then standard e dois métodos específicos de http: sucesso e erro . O método then recebe dois argumentos: um sucesso e um retorno de chamada de erro que será chamado com um objeto de resposta. Os métodos de sucesso e erro usam um único argumento - uma função que será chamada quando a solicitação for bem-sucedida ou falhar, respectivamente. Os argumentos passados para essas funções são uma representação desestruturada do objeto de resposta passado para o método then.
Além do fato de o response
objeto ser destruído em um caso, não entendo a diferença entre
- os retornos de chamada de sucesso / erro passaram a ser passados como argumentos de
promise.then
- os retornos de chamada transmitidos como argumentos para os
promise.success
/promise.error
métodos da promessa
Existe algum? Qual é o objetivo dessas duas maneiras diferentes de transmitir retornos de chamada aparentemente idênticos?
then
retornos de chamada tirar um único argumento - a resposta - enquantosuccess
eerror
ter componentes individuais da resposta como arguments--data
,status
,header
, econfig
..success()
método retorna o objeto de promessa $ http original, pois a cadeia$http(...).success(...).error(...)
é possível. Se, como parece razoável, o inverso$http(...).error(...).success(...)
também for possível,.error()
deverá também retornar o objeto de promessa original. A diferença distintiva.then()
é que ela retorna uma nova promessa.promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
success
foi preterido. De 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.
Já existem algumas boas respostas aqui. Mas vale a pena ressaltar a diferença de paralelismo oferecida:
success()
retorna a promessa originalthen()
retorna uma nova promessaA diferença está nas
then()
operações seqüenciais, pois cada chamada retorna uma nova promessa.$http.get()
seqFunc1()
seqFunc2()
success()
dirige operações paralelas, já que os manipuladores são encadeados com a mesma promessa.$http.get()
parFunc1()
,parFunc2()
Em paralelofonte
then
é atingida resulta nos métodossuccess
eerror
desaparecendo. Além disso, para http respostas de erro (por exemplo, 404) a primeirathen
nohttp.then(ok, err).then(ok, err)
vai passar para oerr
manipulador, mas os seguintes passará para ook
manipulador. Basicamente,http.success().error().success().error()
são encadeados, mas as promessas $ q são bem diferentes, pois tratam especificamente da promessa e da sequência de manipulação (e não da manipulação de solicitações http). Eu tive dificuldade para entender isso até olhar de perto.success
eerror
não são uma API normal de uma promessa, eles são aparafusados no valor de retorno de $ http ().success
será executado depois que o primeiro for executado, mas antes que qualquer promessa retornada seja resolvida, enquanto o segundothen
aguardará. Se você não está retornando promessas, ambos se comportam da mesma forma.Alguns exemplos de código para solicitação GET simples. Talvez isso ajude a entender a diferença. Usando
then
:Usando
success
/error
:fonte
data,status,header,config
vez de simplesmente retornarresponse
?.then () pode ser encadeado e aguardará a resolução .then () anterior.
.success () e .error () podem ser encadeados, mas todos serão acionados ao mesmo tempo (portanto, não há muito sentido nisso)
.success () e .error () são ótimos para chamadas simples (fabricantes fáceis):
então você não precisa digitar isso:
Mas geralmente manipulo todos os erros com .catch ():
Se você precisar oferecer suporte ao <= IE8, escreva seu .catch () e .finally () assim (métodos reservados no IE):
Exemplos de trabalho:
Aqui está algo que eu escrevi em um formato mais codey para atualizar minha memória sobre como tudo acontece com a manipulação de erros, etc:
http://jsfiddle.net/nalberg/v95tekz2/
fonte
Apenas para conclusão, aqui está um exemplo de código indicando as diferenças:
sucesso \ erro:
então:
fonte
Aviso oficial: o sucesso e o erro foram preteridos. Em vez disso, use o método padrão.
link: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http
captura de tela: veja a captura de tela
fonte