【发布时间】:2021-08-16 11:50:57
【问题描述】:
我想调用第一个服务来查询一些数据(返回一个结果数组),然后再次调用第二个服务来为每个结果获取更多数据。每个服务调用的结果都应该合并并返回并显示在一个列表中。我想我理解这部分的工作原理。
我不太确定的部分是要求能够在可用时立即显示第一次服务调用的结果。 UI 应该在数据可用之前显示来自第二个服务调用的字段的加载指示符。
我唯一能想到的是在第一个服务调用和第二个服务调用之后添加“tap”rxjs 操作符,它会在新主题上发出事件,并且 UI 可以监听 _documents$ 主题以显示之后的数据第一次调用,并在第二次调用后显示组合数据。
是否有处理这种情况的最佳做法?我是否遗漏了另一种模式或 rxjs 运算符来简化此操作?
_documents$: BehaviorSubject<DocumentSearchSomething[]> = new BehaviorSubject([]);
private documentSearchQuery$ = new Subject<string>();
constructor(private store: Store, private http: HttpClient) {
this.documentSearchQuery$.pipe(
switchMap((query) => {
return this.http.get<any[]>(`https://my_api.com/service_1?q=${encodeURIComponent(query)}`)
.pipe(
tap(service_1_results => this._documents$.next(service_1_results)),
switchMap(service_1_results => {
// make call to service 2 to get more data for each result, pass in id of every result
return this.http.post<any[]>(`https://my_api.com/service_2`, {
ids: service_1_results.map(r => r.id)
}).pipe(
map(service_2_results => {
// combine service_1_results with service_2_results
const combined = service_1_results.map(r1 => {
const r2 = service_2_results.find(c => c.id === r1.id);
return {...r1, ...r2};
});
return combined;
}),
tap(combined_results => this._documents$.next(combined_results))
);
})
);
}),
).subscribe();
}
【问题讨论】:
标签: javascript angular rxjs