Ho un servizio che interagisce con un server API. Ha il metodo myHttpPost (dati). Questo metodo dovrebbe:In Angular2, come intercettare la risposta di errore da osservabile e trasmetterla al canale di errore
- chiamata http.post di angolare al server
- se la risposta è stato di 200, di fornire contenuti JSON della risposta al sottoscrittore
- se la risposta è stato diverso, processo di risposta e di fornire l'errore elaborati per l'abbonato
la versione corrente del mio metodo è:
postData(path: string, data: Object): Rx.Observable<any> {
let json = JSON.stringify(data);
return this.http.post(path, json)
.map(res => res.json())
}
Questo non sta facendo il punto 3 dall'elenco precedente, perché la mappa è chiamata solo su successo e non su errore. Potrei cambiare la sequenza con l'aggiunta di:
.catch(error => {
let myError = prepareErrorContent(error);
return Rx.Observable.throw(myError);
});
Poi l'abbonato (un altro servizio) riceve myError (che è ok), ma la documentazione rxjs dice il seguente sulla cattura() metodo: ", continua una sequenza osservabile che è terminato da un'eccezione con la successiva sequenza osservabile. " Ma voglio che la sequenza termini normalmente e non continui. Se utilizzo lo catch()
come sopra, la successiva chiamata a postData() dal sottoscrittore non funziona (restituisce immediatamente lo stesso errore invece di effettuare la chiamata http). Penso che sia perché la sequenza non è terminata.
Come fare?
[Edit] Questo è il mio metodo di abbonati che utilizza questo servizio:
this.jsonHttp.postData(path, data)
.subscribe(
struct => onNext(struct),
error => {
let message = this.jsonHttp.extractError(error);
onError(message)
},
() => onComplete ? onComplete() : null
);
Come si chiama il metodo 'postData'? Grazie! –
Si prega di consultare l'aggiornamento nel mio post. – camcam