2016-10-18 4 views
3

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:

  1. 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.

  2. 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.

Antwort

1

landete ich mit distinctUntilChanged bis zu meinem Ziel zu archivieren:

getList() { 
    return Observable.timer(0, 1000) 
     .concatMap(() => this.http.get(this.apiURL) 
     .distinctUntilChanged(null, x => x.json().info[1].value) 
     .map(this.extractData) 
     .catch(this.handleError); 
    } 

Deshalb, wenn der Strom und die letzte Antwort die gleiche bestimmten Wert, die neueste Antwort fallen gelassen wird. Ich denke, meine Frage war nicht klar genug und ich erwähnte nicht, dass die Entscheidung, eine Antwort zu löschen, von der vorherigen abhängt.

Ein Nachteil dieser Ansatz ist, dass die Antwort zweimal analysiert werden muss, aber ich denke, das kann nicht vermieden werden. Es wäre schön zu wissen, ob der JSON-Ansatz schneller ist als ein kompletter String-Vergleich des Ergebnisses (Körper).

Wenn die Entscheidung, eine Antwort zu löschen, nur von der aktuellen Antwort abhängt, würde ich empfehlen, eine filter zu verwenden.

1

Wenn ich richtig verstehe, suchen Sie nach dem Operator switchMap.

Wenn innerhalb von 1 Sekunde (dem angegebenen Intervall) keine Antwort eingeht, wird die HTTP-Anforderung stillgelegt und eine weitere gestartet.

Update:

Wenn Sie schauen, um die HTTP-Anforderung manuell zu löschen, müssen Sie eine cancelSubject: Subject schaffen und eine takeUntil(cancelSubject) auf der HTTP-Anforderung zu definieren.

die HTTP-Anforderung abzubrechen, Sie einfach cancelSubject.next(true) nennen, was wiederum die HTTP-Anforderung abbrechen, weil takeUntil wirksam wird.

Beachten Sie, dass die Anfrage nach einer Sekunde neu gestartet wird. Wenn Sie den Timer abbrechen möchten, müssen Sie die .takeUntil(cancelSubject) auf die äußere Observable setzen.

+0

Ich möchte nicht eine HTTP-Anfrage zu stoppen, ich möchte nur die Antwort ignorieren/löschen. – Akkusativobjekt

Verwandte Themen