2017-06-20 17 views
2

私は外部APIへのREST呼び出しを実行するAngularサービスクラス(WeatherService)があり、searchWeatherのデータをフェッチするシナリオを打ちました) 関数。Angular 2 Subject.next Observableのリスンがエラーをスローした後に動作しない

私はコンポーネントのWeatherSearchComponentを持っています。このコンポーネントには、コンポーネントのonSearch()関数にkeyupイベントがバインドされているテンプレートの入力フィールド検索があります。基本的にTypeAhead入力フィールド。私はクラスで定義されたSubjectを持っており、onSearch()関数では次のようにsubjectのnext()関数を初期化しています。

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 
      ); 
    } 

WeatherService:

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

REST呼び出しがエラーを失敗したか、返した場合、私が直面してる問題は、あるイムはそれをログに記録するが、件名searchStreamのライフサイクルエラーが発生し、それ以降は入力を受け付けないと終了します。私はngOnInit()メソッドでエラーを処理しようとしましたが、動作しません。

このシナリオをどのように処理するかを知りたいですか?

答えて

2

Subjectでは問題ありません。これは一般的なRxの動作です。エラー通知を送信すると、チェーンが破棄されます。

あなたはまだあなただけのエラーを再スローが、それを抑制したり、あなたが好きなしないようにそのコールバックを変更することができ.catch()を使用している:

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

ところで、被験者は、あなたがあるべき内部状態を持っていますあなたのユースケースでは、エラーは件名に到達しません。

+0

はい、上記の実装が機能しました。実装が本番環境で使用するのが適切で適切であるかどうかを知りたいですか?または私は何か違うべきですか? –

関連する問題