对于如何将.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
的第二个版本所示。
答案 0 :(得分:4)
_callApi
的第一个版本似乎返回Observable
,而第二个版本返回Subscription
个对象。并且Subscription
不会公开do
,正如错误消息所述。
您可能想要尝试使用的do
版本除了error
回调之外还接受complete
和next
个回调:
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产生错误或取消订阅时它不会被调用。