Selon la documentation AngularJS , les appels pour $http
renvoyer ce qui suit:
Renvoie un objet de promesse avec la méthode standard then et deux méthodes spécifiques http: succès et erreur . La méthode then prend deux arguments un succès et un rappel d' erreur qui sera appelé avec un objet de réponse. Les méthodes de succès et d' erreur prennent un seul argument - une fonction qui sera appelée lorsque la demande réussit ou échoue respectivement. Les arguments passés dans ces fonctions sont une représentation déstructurée de l'objet de réponse transmis à la méthode then.
Mis à part le fait que l' response
objet est déstructuré dans un cas, je ne comprends pas la différence entre
- les rappels de succès / erreur passés pour être passés comme arguments de
promise.then
- les callbacks passés en arguments pour les méthodes
promise.success
/promise.error
de la promesse
Y a-t-il? Quel est l'intérêt de ces deux façons différentes de passer des rappels apparemment identiques?
then
callbacks prennent un seul argument - la réponse - toutsuccess
eterror
prendre des composants individuels de la réponse en arguments--data
,status
,header
etconfig
..success()
méthode retourne l'objet de promesse $ http original, car la chaîne$http(...).success(...).error(...)
est possible. Si, comme cela semble raisonnable, l'inverse$http(...).error(...).success(...)
est également possible, alors.error()
devrait également renvoyer l'objet de promesse d'origine. La différence distinctive de.then()
est qu'il renvoie une nouvelle promesse.promise.success = function(fn) { promise.then(function(response) { fn(response.data, response.status, response.headers, config); }); return promise; };
success
est obsolète. 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.
Il y a déjà de bonnes réponses ici. Mais cela vaut la peine de souligner la différence de parallélisme offerte:
success()
renvoie la promesse originalethen()
renvoie une nouvelle promesseLa différence réside dans
then()
les opérations séquentielles, car chaque appel renvoie une nouvelle promesse.$http.get(/*...*/). then(function seqFunc1(response){/*...*/}). then(function seqFunc2(response){/*...*/})
$http.get()
seqFunc1()
seqFunc2()
success()
conduit des opérations parallèles, puisque les gestionnaires sont enchaînés sur la même promesse.$http(/*...*/). success(function parFunc1(data){/*...*/}). success(function parFunc2(data){/*...*/})
$http.get()
parFunc1()
,parFunc2()
en parallèlela source
then
est atteinte entraîne la disparition des méthodessuccess
eterror
. De plus, pour les réponses d'erreur http (par exemple 404), le premierthen
inhttp.then(ok, err).then(ok, err)
passera auerr
gestionnaire mais les suivants passeront auok
gestionnaire. Fondamentalement, ilshttp.success().error().success().error()
peuvent être chaînés mais les promesses $ q sont assez différentes en ce sens qu'elles concernent uniquement la promesse et la séquence de traitement (et non la gestion des requêtes http). J'ai eu du mal à comprendre cela jusqu'à ce que je regarde de près.success
eterror
ne sont pas des API normales d'une promesse, elles sont boulonnées sur la valeur de retour de $ http ().success
s'exécutera après l'exécution du premier mais avant que toute promesse renvoyée par lui ne soit résolue alors que le secondthen
attendra. Si vous ne rendez pas vos promesses, les deux se comportent de la même manière.Quelques exemples de code pour une simple requête GET. Peut-être que cela aide à comprendre la différence. Utilisation
then
:$http.get('/someURL').then(function(response) { var data = response.data, status = response.status, header = response.header, config = response.config; // success handler }, function(response) { var data = response.data, status = response.status, header = response.header, config = response.config; // error handler });
Utilisation de
success
/error
:$http.get('/someURL').success(function(data, status, header, config) { // success handler }).error(function(data, status, header, config) { // error handler });
la source
data,status,header,config
plutôt que de simplement renvoyerresponse
?.then () est chaînable et attendra la résolution de .then () précédente.
.success () et .error () peuvent être enchaînés, mais ils se déclencheront tous en même temps (donc pas grand chose à cela)
.success () et .error () sont juste bien pour les appels simples (fabricants faciles):
$http.post('/getUser').success(function(user){ ... })
donc vous n'avez pas à taper ceci:
$http.post('getUser').then(function(response){ var user = response.data; })
Mais généralement, je gère toutes les erreurs avec .catch ():
$http.get(...) .then(function(response){ // successHandler // do some stuff return $http.get('/somethingelse') // get more data }) .then(anotherSuccessHandler) .catch(errorHandler)
Si vous avez besoin de prendre en charge <= IE8, écrivez votre .catch () et .finally () comme ceci (méthodes réservées dans IE):
.then(successHandler) ['catch'](errorHandler)
Exemples de travail:
Voici quelque chose que j'ai écrit dans un format plus codé pour rafraîchir ma mémoire sur la façon dont tout se joue avec les erreurs de gestion, etc.
http://jsfiddle.net/nalberg/v95tekz2/
la source
Juste pour terminer, voici un exemple de code indiquant les différences:
succès \ erreur:
$http.get('/someURL') .success(function(data, status, header, config) { // success handler }) .error(function(data, status, header, config) { // error handler });
puis:
$http.get('/someURL') .then(function(response) { // success handler }, function(response) { // error handler }) .then(function(response) { // success handler }, function(response) { // error handler }) .then(function(response) { // success handler }, function(response) { // error handler }).
la source
Avis officiel: le succès et l'erreur sont obsolètes, veuillez utiliser la méthode standard then à la place.
lien: https://code.angularjs.org/1.5.7/docs/api/ng/service/$http
capture d'écran: voir la capture d'écran
la source