Dans Angular2, comment intercepter la réponse d'erreur à partir d'observable et la transmettre au canal d'erreur
J'ai un service qui interagit avec un serveur d'api. Il a myHttpPost(données) de la méthode. Cette méthode doit:
- appel Angulaire du http.post au serveur
- si la réponse a 200, fournir la réponse du contenu json à l'abonné
- si la réponse a statut différent, le processus de la réponse et de fournir des traités d'erreur à l'abonné
La version actuelle de ma méthode est la suivante:
postData(path: string, data: Object): Rx.Observable<any> {
let json = JSON.stringify(data);
return this.http.post(path, json)
.map(res => res.json())
}
Ce n'est pas le point 3 de la liste ci-dessus, parce que la carte est appelée uniquement en cas de succès, et non sur l'erreur. Que je puisse changer la séquence en ajoutant:
.catch(error => {
let myError = prepareErrorContent(error);
return Rx.Observable.throw(myError);
});
Puis l'abonné (un autre service) reçoit myError (c'est ok) mais le rxjs documentation est dit ce qui suit au sujet de catch() méthode: "Continue d'observer une séquence qui se termine par une exception à la prochaine observables séquence". Mais je veux la séquence de mettre fin normalement et de ne pas poursuivre. Si j'utilise le catch()
comme ci-dessus, alors le prochain appel à postData() de l'abonné ne fonctionne pas (il retourne la même erreur au lieu de faire un appel http). Je pense que c'est parce que la séquence n'est pas terminée.
Comment faire?
[Modifier]
C'est mon abonné méthode qui utilise ce service:
this.jsonHttp.postData(path, data)
.subscribe(
struct => onNext(struct),
error => {
let message = this.jsonHttp.extractError(error);
onError(message)
},
() => onComplete ? onComplete() : null
);
source d'informationauteur camcam
Vous devez vous connecter pour publier un commentaire.
En fait, pour chaque requête HTTP d'une chaîne de traitement est créé et exécuté. Lors de la réception de la réponse (à la fois performante et avec l'erreur), la chaîne est terminée.
Si vous exécutez deux fois par la demande, il n'y a pas de lien entre eux. Vous pouvez avoir quelques liens lorsque les deux demandes font partie de la même chaîne de traitement. Par exemple lors de l'utilisation d'observables opérateurs comme
flatMap
ouswitchMap
. Voici un exemple:Lorsqu'une erreur se produit, la chaîne de traitement est interrompu et l'
catch
opérateur est appelé. Vous pouvez nous retourner un observables dans la fonction de rappel pour continuer la chaîne de traitement. Il peut être un classique observables ou une erreur de l'un avecObservable.throw
. Dans le contexte d'une requête HTTP dans Angular2, une réponse avec un code de statut différent de 2xx est considéré comme une erreur.Lors du retour de
Observable.throw
le deuxième rappel spécifié lors de l'abonné est appelé. Si c'est un autre observable, le premier rappel est appelée. Par exemple:J'ai mis en place un plunkr que l'exécution d'une demande (en cliquant sur un bouton), sans en-tête d'authentification, de sorte 401 code d'état est reçu. Lorsque vous cliquez sur nouveau, l'en-tête est ajouté, un code d'état 200 est reçu. Juste pour vous montrer qu'il n'existe aucune relation entre les deux demandes.
Voir ce plunkr: https://plnkr.co/edit/5WwWpwjvQmJ4AlncKVio?p=preview.