需要我的angular服务知道所有组件异步操作何时结束
我有一个角度服务,拥有一个可观察的。我订阅了多个(可变数量)的组件,它们对执行异步操作作出反应。我需要我的服务知道所有这些组件异步操作何时结束 这就是我的处境: 过滤服务需要我的angular服务知道所有组件异步操作何时结束,angular,asynchronous,rxjs,observable,Angular,Asynchronous,Rxjs,Observable,我有一个角度服务,拥有一个可观察的。我订阅了多个(可变数量)的组件,它们对执行异步操作作出反应。我需要我的服务知道所有这些组件异步操作何时结束 这就是我的处境: 过滤服务 ... appliedFilter$: Observable<FormattedFilter[]> = new Observable<FormattedFilter[]>( o => (this.appliedFilter = o) ).pipe(shareReplay(1));
...
appliedFilter$: Observable<FormattedFilter[]> = new Observable<FormattedFilter[]>(
o => (this.appliedFilter = o)
).pipe(shareReplay(1));
private appliedFilter: Observer<FormattedFilter[]>;
onFiltersApplied(filters: Filter[]): void {
if (this.appliedFilter) {
const formattedFilters = this.formatFilters(filters);
this.appliedFilter.next(formattedFilters);
}
}
...
可过滤组件2
...
this.filterService.appliedFilter$.subscribe(filters => {
// multiple pipelined async operations
});
...
可过滤组件3
...
this.filterService.appliedFilter$.subscribe(filters => {
// multiple pipelined async operations
});
...
因此,我需要的是Filter服务来通知所有组件何时通过appliedFilter$Observable应用了接收到的过滤器,以及何时最终加载了所有过滤数据
这样做的目的是防止用户在所有组件完成过滤过程之前更新过滤器
谢谢 是否确实需要等待组件更新,而不是分别更新组件以过滤更改? 在大多数友好、用户友好的应用程序中,方法似乎有所不同: 如果某个组件在应用新筛选器时未完成更新,则更新将被取消并重新启动 在您的例子中,可以使用rxjs操作符来实现。这个操作符允许您完全按照我刚才所说的去做——放弃当前的异步操作,如果有新的操作出现,就开始新的操作 以下是一个例子:
...
this.filterService.appliedFilter$
.pipe(
switchMap(
filters => { return yourObservableChain()} // chain is your async opeartions
)
)
.subscribe(); // you have only the most relevant values here
...
那么,接下来要做什么:
YourObservaleCain
被调用(它可以是http请求或您所说的任何其他内容(异步操作)您确定需要等待组件更新,而不是分别更新组件以筛选更改吗?因此,如果应用新筛选器时某些组件没有更新,就让它取消当前更新并执行新操作。这就是好的应用程序通常的工作方式。@ArtemArkhipov我没有任何特定的需要。您的方法似乎不错。但我不确定如何取消当前的更新,因为它们可能非常复杂。我在下面为您发布了一个答案。谢谢,我会尝试一下。如果您能对您的案例进行最小程度的复制,将更容易帮助您并展示一些具体的内容
...
this.filterService.appliedFilter$
.pipe(
switchMap(
filters => { return yourObservableChain()} // chain is your async opeartions
)
)
.subscribe(); // you have only the most relevant values here
...
import { switchMap } from 'rxjs/operators'; // don't forget
... your components code:...
this.triggerSubject$.pipe( // assume this emits with some urls
switchMap(data => { // assume new url is a prop of data
return this.http.get(data.URL); // returns observable
})
).subscribe(results => {
// having only fresh results here
// because switchMap cancelled other requests
console.log(results) // or do whatever you need
})