Angular 2 Subject.next 一旦它监听的 Observable 抛出错误就无法工作

Angular 2 Subject.next not working once the Observable its listens throws an error

我对一个场景感到震惊,我有 Angular 服务 class (WeatherService),它对外部 api 执行 REST 调用并在 searchWeather() 中获取数据功能。

我有一个组件 WeatherSearchComponent,它在其模板中有输入字段搜索,该模板具有绑定到组件中的 onSearch() 函数的 keyup 事件。它基本上是一个 TypeAhead 输入字段。我在 class 和 onSearch() 函数中定义了一个主题,我正在初始化主题的 next() 函数,如下所示。

天气搜索组件:

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

气象服务:

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 调用失败或 returns 一个错误,我会记录它,但是主题 searchStream 生命周期一旦出现错误就会结束并且在之后不接受输入那。我尝试处理 ngOnInit() 方法中的错误,但它不起作用。

我想知道如何处理这种情况?

这不是 Subject 的问题。这是一般的 Rx 行为。当您发送错误通知时,链将被处理。

您已经在使用 .catch(),因此您可以修改其回调而不是重新抛出错误,而是抑制它或任何您想要的:

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

顺便说一句,Subjects 确实有一个你应该知道的内部状态,但在你的用例中,错误没有到达 Subject。