嗨,我的主题订阅和搜索电话出现问题。我想取消上一个通话,转而使用当前通话。我已经搜索了以前的主题,但是没有找到答案。
我知道我应该使用switchMap(),但是我没有成功。无论状态如何,它都会继续所有呼叫。我认为这与我设置的方式有关,因为我没有返回我正在设置的响应。因此,没有可观察的参考。
感谢所有帮助!
请参见下面的代码:
ngOnInit() {
// I subscribe to the Subject Observable here
this._searchService.quickSearch$
.pipe(
debounceTime(1000),
distinctUntilChanged()
)
.subscribe(
// when value has changed I call runSearch
(queryString) => {this.runSearch(queryString);
}
);
}
runSearch:
runSearch(searchString: any) {
this.quickSearch.runSearch(searchString).pipe(
//Not working as expected
switchMap(() => {
console.log('switchMap has bee fired');
return this.quickSearch.runSearch(searchString);
})
).subscribe(
(response) => {
// set the two way bind here
this.apiResponse = response;
},
(error) => {
console.log('ERROR!!!');
},
() => {
// this is fired when the observable is closed
console.log('I have been unsubscribed');
}
);
}
快速搜索服务:
runSearch(search: string): Observable<QuickSearch[]> {
...
return this.http.get<QuickSearch[]>(this.api.url, { params: param, headers: header })
.pipe(
map((data: any) => {
return data.map((item: any[]) => this.adapter.adapt(item));
}
),
catchError(error => error)
);
}
谢谢
更新
我仍然没有找到这个问题的答案。因此,我将尝试重新措辞。
我有5个部分:
Input box ([])->
rxjs-Subject (input-text)->
runSearch(input-text) -> [ handles response ]
_service.runSearch(input-text) ->
http().get(input-text) => response
更改输入框后,将调用运行搜索,在运行搜索中也订阅了搜索服务,这不会返回
答案 0 :(得分:2)
问题在于,每次this._searchService.quickSearch$
发出信号时,您都在调用runSearch
方法,该方法每次都会创建一个新链,因此即使您拥有switchMap
也没有什么区别。
相反,您应该将switchMap
放在第一条链上:
this._searchService.quickSearch$
.pipe(
debounceTime(1000),
distinctUntilChanged(),
switchMap((searchString) => this.quickSearch.runSearch(searchString)),
).subscribe(
(response) => {
this.apiResponse = response;
},
...
);