4

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

我有一个组件 WeatherSearchComponent,它在其模板中有输入字段搜索,其中 keyup 事件绑定到组件中的函数 onSearch()。它基本上是一个 TypeAhead 输入字段。我在类和 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 调用失败或返回错误,我会记录它,但是一旦出现错误,Subject searchStream 生命周期就会结束,并且之后它不接受输入。我尝试处理 ngOnInit() 方法中的错误,但它不起作用。

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

4

1 回答 1

3

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

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

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

顺便说一句,主题确实有一个您应该注意的内部状态,但在您的用例中,错误不会到达主题。

于 2017-06-20T05:43:50.570 回答