“订阅”类型中不存在“do”属性

时间:2017-07-25 23:22:58

标签: javascript angular rxjs observable subscribe

对于如何将.subscribe函数与.do函数结合使用,我有什么误解?

这是我的可观察序列:

  lookupSubscriber = (text$: Observable<string>) =>

  text$.debounceTime(300)
     .distinctUntilChanged()
     .do(() => this.searching = true)
     .switchMap(term => {
        var data = this._callApi(this.lookupSubscriberAPI, term)
           .do(() => {
              this.searchFailed = false;
              this.searching = false;
           })
           .catch(() => {
              this.searchFailed = true;
              this.searching = false;
              return Observable.of([]);
           })
        return data;
     })
     .do(() => this.searching = false);

如果我的_callApi函数如下,它可以工作:

_callApi(url: string, term: string) {
  if (term === '') {
     return of.call([]);
  }

  return map.call(this.dataService.get(url + term), response => {
     var data = this._transformSubscriberInfo(response);
     return data;
  })

}

但是,当我尝试使用subscribe函数重写它时:

   _callApi = (url: string, term: string) => {

     return this.dataService.get(url + term)
        .subscribe(
           response => { this._transformSubscriberInfo(response) }, 
           error => error.text(), 
           () => {
              if (Logging.isEnabled.light) {
                 console.log('%c API Call Complete', Logging.normal.orange);
              }
        ))
}

...然后数据调用成功,但收到错误:Property 'do' does not exist on type 'Subscription'.

基本上我试图捕获错误并在api调用后运行“always”函数,如_callApi的第二个版本所示。

1 个答案:

答案 0 :(得分:4)

_callApi的第一个版本似乎返回Observable,而第二个版本返回Subscription个对象。并且Subscription不会公开do,正如错误消息所述。

您可能想要尝试使用的do版本除了error回调之外还接受completenext个回调:

return this.dataService.get(url + term)
    .map(response => this._transformSubscriberInfo(response))
    .do(
        response => { /* log response */ }, 
        error => { /* log error */ }, 
        () => { /* log completion */ }
    );

值得一提的是do无法转换源流,它返回的observable包含与调用它的observable相同的值。这就是为什么我们需要行.map(response => this._transformSubscriberInfo(response))

同样complete回调不应该与“always”函数混淆:只有当源observable完成时才会调用它,而当observable产生错误或取消订阅时它不会被调用。