Mit Hilfe von Observable.timer(0, 1000) mache ich kontinuierliche Anfragen an meinen Server in einem definierten Zeitrahmen. Nachdem ich den Inhalt der Antwort verarbeitet ist es möglich, unter besonderen Bedingungen und auf der vorherige Antwort abhängig, die ich brauche die Antwort fallen und daher auch nicht an den Teilnehmer des Dienstes übergeben:So löschen Sie die Antwort eines Observable
@Injectable()
export class LoggerService {
constructor(private http: Http) { }
private apiURL = 'assets/file.json';
getList() {
return Observable.timer(0, 1000)
.concatMap(() => this.http.get(this.apiURL))
.map(this.extractData)
.catch(this.handleError););
}
private extractData(res: Response) {
var fooot = new Foo();
fooot.fillFromJSON(JSON.stringify(res.json()));
if(fooot.getProperty()){
//DROP IT
}
return fooot;
}
private handleError(error: any) {
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
return Observable.throw(errMsg);
}
}
Des getList()
Methode wird dann von ngOnInit
einer Komponente aufgerufen. Im Moment gibt es zwei mögliche Lösungen, die ich denken kann, kaufen vielleicht gibt es einen besseren/klaren Ansatz, um dieses Problem zu lösen:
Wenn ich die Antwort fallen muß ich ein spezielles Objekt zu erstellen, der anerkannt durch den Teilnehmer von
getList()
und dann speziell behandelt. Aber diese Lösung wäre sehr hässlich, weil die unterbrochene Antwort meinen Dienst verlässt und ich extra Code außerhalb des Dienstes schreiben muss, um diesen Fall zu behandeln.Ich werfe eine Ausnahme, wenn ich die Antwort ablegen muss. Dann wird die Ausnahme abgefangen, erkannt (um sie von anderen Fällen zu unterscheiden) und dann ohne Benachrichtigung/Ausgabe gelöscht. Danach wird das Observable neu gestartet. Der Vorteil dieses Ansatzes ist, dass die Observable, die gelöscht werden sollte, um den Dienst nicht zu verlassen, aber ich mag die Verwendung von Ausnahmen in diesem Fall für den Kontrollfluss nicht.
Ich habe versucht beide Lösungen und sie arbeiten, aber ich hoffe, es gibt einige bessere Ansätze.
Ich möchte nicht eine HTTP-Anfrage zu stoppen, ich möchte nur die Antwort ignorieren/löschen. – Akkusativobjekt