switchMap中的函数被调用两次。我不明白为什么,但是它正在发生。您能帮我解决这个问题吗?我需要调用一次此函数。
search(status = 0, groupId = 0, purchaseId = 0, pagedSearchQueries: Observable<PagedSearchQuery>): Observable<PurchaseItemListResult> {
return pagedSearchQueries.pipe(
debounce(val => val.isAutoLoad ? timer(1) : timer(400)),
distinctUntilChanged(),
switchMap(pagedSearchQuery => this.searchItems(status, groupId, purchaseId, pagedSearchQuery))
);
}
private searchItems(status = 0, groupId = 0, purchaseId = 0, pagedSearchQuery: PagedSearchQuery): Observable<PurchaseItemListResult> {
const params = new HttpParams()
.set('status', status.toString())
.set('groupId', groupId.toString())
.set('purchaseId', purchaseId.toString())
.set('offset', pagedSearchQuery.offset.toString())
.set('limit', pagedSearchQuery.limit.toString());
return this.http
.get<PurchaseItemListItem[]>(`${this.endpoint}?search=${pagedSearchQuery.query}`, {
observe: 'response',
params
}).pipe(
map(res => {
return new PurchaseItemListResult(parseInt(res.headers.get('X-Total-Count'), 10),
pagedSearchQuery.offset,
pagedSearchQuery.limit,
pagedSearchQuery.query,
res.body);
}),
catchError(this.handleError)
);
}
答案 0 :(得分:0)
这可能是由于多个订阅,例如@mbojko所说。您可以发布“具有订阅者的功能”吗?
尝试在share
之后添加switchMap
运算符。这会将当前可观察的多播组播到多个订阅,并且如果存在至少一个订阅,则它将处于活动状态。 share
之前的所有内容将只执行一次。
search(status = 0, groupId = 0, purchaseId = 0, pagedSearchQueries: Observable<PagedSearchQuery>): Observable<PurchaseItemListResult> {
return pagedSearchQueries.pipe(
debounce(val => val.isAutoLoad ? timer(1) : timer(400)),
distinctUntilChanged(),
switchMap(pagedSearchQuery => this.searchItems(status, groupId, purchaseId, pagedSearchQuery)),
share()
);
}
如果使用可观察对象.subscribe()
或在模板中使用async
管道,则可以进行Angular订阅。他们每个人都会产生一个新的订阅。