2016-11-18 3 views
1

Ich habe eine einfache Suchmethode mit RXJS debounceÄnderung Methode wird nicht nach Fehler im Service Angular 2

wie folgt.

this.searchTerm.valueChanges 
     .debounceTime(this._debounceDelay, this._scheduler) 
     .distinctUntilChanged() 
     .filter(this.filterForBlank.bind(this)) 
     .filter(this.filterForLength.bind(this)) 
     .switchMap(term => this.searchService.serchBy(term)) 
     .subscribe((data) => { 
     // do something 
     }, (err) => { 
      // show error on UI 
     }); 




private filterForLength(term: string) { 
    return (term.trim().length > 2); 
    } 

    private filterForBlank(term: string) { 
    if (isEmpty(term)) { 
       return false; 
    } 
    return true; 
    } 

aber wenn es ein Fehler ist, zum Beispiel, änderte ich die URL des falschen ... diese Änderungsfunktion wieder nicht treffen wird. auch nach dem Ändern des Wertes

Ich denke, ich muss beobachtbar töten, wenn es einen Fehler gibt. Aber genau, wie man das erreicht.

Antwort

0

Ihre Erklärung ist fast richtig. Wenn Sie den beobachtbaren Fehler zulassen, ohne den Fehler abzufangen, wird es wahrscheinlich nicht mehr funktionieren. Sie müssen den Operator catch verwenden, um Fehler abzufangen und Fehler zu beheben, ohne die Observable zu "töten".

Dies könnte wie folgt aussehen:

this.searchTerm.valueChanges 
    .debounceTime(this._debounceDelay, this._scheduler) 
    .distinctUntilChanged() 
    .filter(this.filterForBlank.bind(this)) 
    .filter(this.filterForLength.bind(this)) 
    .switchMap(term => this.searchService.serchBy(term)) 
    .catch(errors => { 
    return Rx.Observable.empty(); 
    }); 
    .subscribe((data) => { 
    // do something 
    }); 

Nun, wenn Sie Back-End-Anruf ausfällt, wird es anmutig durch die catch-Klausel behandelt und einen neuen leeren Wert zurück. Sie können diesen leeren Wert verwenden, um alle Daten zu löschen, die bei Erfolg angezeigt werden. Wenn es funktioniert, wird nur die Fangklausel übersprungen.

EDIT: Sie haben Recht. Dies wird nicht funktionieren. Aufgrund der Tatsache, dass bei einem beobachtbaren Kettenfehler die gesamte Kette gebrochen ist. Um es zu beheben, müssen Sie dies tun:

this.searchTerm.valueChanges 
    .debounceTime(this._debounceDelay, this._scheduler) 
    .distinctUntilChanged() 
    .filter(this.filterForBlank.bind(this)) 
    .filter(this.filterForLength.bind(this)) 
    .switchMap(term => 
       this.searchService.serchBy(term) 
        .catch(errors => { 
          // show error on ui 
          return Rx.Observable.empty() 
        })) 
    .subscribe((data) => { 
    // do something 
    }); 

Durch Verschieben der catch-Anweisung innerhalb des switchMap, wird es die beobachtbaren Ketten innerhalb dieser switchMap sein, die brechen. Die ursprüngliche Kette beginnt jedoch mit den 'this.searchTerm.valueChanges' nicht und wird am Leben erhalten.

Ich entschuldige mich für die falsche Antwort.

+0

funktioniert nicht !! es wird fangen, aber nach Wertänderung wieder ruft es API nicht auf –

Verwandte Themen