2017-06-20 5 views
2

Ich bin in einem Szenario, wo ich Angular Service-Klasse (WeatherService), die einen REST-Aufruf an eine externe API führt und holt Daten in SearchWeather () Funktion.Angular 2 Subject.next funktioniert nicht, sobald die Observable ihre hört einen Fehler

Ich habe eine Komponente WeatherSearchComponent, die Eingabefeldsuche in seiner Vorlage hat, die Keyup-Ereignis an eine Funktion onSearch() in der Komponente gebunden hat. Es ist im Grunde ein TypeAhead-Eingabefeld. Ich habe ein Thema definiert in der Klasse und in onSearch() -Funktion Ich initialisiere die nächste() Funktion des Themas wie folgt.

WeatherSearchComponent:

private searchStream = new Subject<string>(); 
onSearch(cityName:string) { 
     this.searchStream 
      .next(cityName); 
    } 

constructor(private _weatherService:WeatherService) { 
    } 

ngOnInit() { 
     this.searchStream 
      .debounceTime(300) 
      .distinctUntilChanged() 
      .switchMap((input:string) => this._weatherService.searchWeatherData(input)) 
      .subscribe(
       data => this.data = data 
      ); 
    } 

Weather:

searchWeatherData(cityName: string): Observable<any> { 
     return this._http.get('URL') 
      .map(response => response.json()) 
      .catch(error => { 
       console.error(error); 
       return Observable.throw(error.json()) 
      }); 
    } 

Das Problem, das ich bin Bewurf ist, wenn der REST-Aufruf fehlschlägt oder gibt einen Fehler zurück, Im es angemeldet haben, aber das Thema searchStream Lebenszyklus endet, sobald ein Fehler auftritt und Eingaben danach nicht akzeptiert werden. Ich habe versucht, den Fehler in der ngOnInit() -Methode zu behandeln, aber es funktioniert nicht.

Ich würde gerne wissen, wie Sie mit diesem Szenario umgehen?

Antwort

2

Es ist kein Problem mit der Subject. Dies ist allgemeines Rx-Verhalten. Wenn Sie eine Fehlerbenachrichtigung senden, wird die Kette entfernt.

Sie sind bereits .catch() mit so können Sie einfach seinen Rückruf ändern nicht den Fehler erneut auslösen, aber es unterdrücken oder was auch immer Sie wollen:

.catch(error => { 
    console.error(error); 
    return Observable.empty() 
}); 

By the way, Themen haben einen internen Zustand Sie sein sollte bewusst, aber in Ihrem Anwendungsfall erreicht der Fehler nicht das Thema.

+0

Ja, die obige Implementierung funktioniert. Ich würde gerne wissen, ob die Implementierung korrekt und geeignet ist, in einer Produktionsumgebung zu verwenden? Oder sollte ich etwas anderes? –

Verwandte Themen