我在代码中有3个独立的位置,它们调用VerificationService
方法getOrganizationView()
。
getOrganizationView(): Observable<any> {
return this.httpClient.http.post(...)
}
第一名是主要服务
@Injectable()
export class Principal {
constructor(private verificationService: VerificationService) {}
identity(force?: boolean): Promise<any> {
return this.verificationService.getOrganizationView().toPromise().then((response ) => {
...
})
}
}
还有一项名为LinkAccessService
的服务,其执行的Principal
并不是重点
还有一个地方是组件:
export class VerificationComponent implements OnInit {
constructor(private verificationService: VerificationService) {
}
ngOnInit() {
this.verificationService.getOrganizationView()
.subscribe((data: VerificationView) => {
...
});
}
}
在加载应用程序时,我只有3个调用,而不是单个请求,但是这些实体是绝对独立的,并且我无法像组件指令之间共享数据,等等。
在Angular 2+中,传统上如何解决这样的问题? 我不是要提供明确的答案代码,而是要有主意。
答案 0 :(得分:3)
最简单的缓存数据的方法是使用shareReplay
rxjs运算符:
import { shareReplay } from 'rxjs/operators';
@Injectable()
export class VerificationService {
organizationViewCache$: Observable<any>;
getOrganizationView() {
if (!this.organizationViewCache$) {
this.organizationViewCache$ = this.http.get(...).pipe(shareReplay(1));
}
return this.organizationViewCache$;
}
}
另请参阅:
答案 1 :(得分:2)
您可以构建一个检索和缓存数据的服务。然后,注入服务的任何组件都可以访问该缓存的数据,而无需对服务器的另一个请求。
export class ProductService {
private productsUrl = 'api/products';
products: IProduct[];
getProducts(): Observable<IProduct> {
// Returns the cached list if it exists.
if (this.products) {
return of(this.products);
}
return this.http.get<IProduct[]>(this.productsUrl)
.pipe(
tap(data => this.products = data),
catchError(this.handleError)
);
}
}
还有其他几种答案,包括在此处使用RxJS ReplaySubject
:What is the correct way to share the result of an Angular Http network call in RxJs 5?
答案 2 :(得分:0)
我不确定100%如何设置您的应用。但是如果我是您,我会考虑使用Event Emitter。您可以让它发出一个事件,您的不同组件可以监听。应该调用的组件中的任何一个都将使其正确,而其他组件则不应。