我有一些http方法可返回Observable数据。所有方法都投入使用:
class Service {
requests1(): Observable<any> {
return http...;
}
requests2(): Observable<any> {
return http...;
}
requests3(): Observable<any> {
return http...;
}
}
在应用程序中的某个地方,我会像这样使用它:
Service.request1().subscribe((data) => {
console.log(data);
});
在嵌套组件中,还会调用另一个请求:
Service.request2().subscribe((data) => {
console.log(data);
});
如何从应用程序的不同部分使用forkJoin加入他们?
forkJoin(request1, request2) {}
问题是一个request1
正在从父组件中调用,另一个request2
正在子内部中调用。
我需要joinFork来确保它们完成吗?
我有想法列出所有可观察对象,例如:
export let request1Obs: Observable<any>;
export let request2Obs: Observable<any>;
export let request3Obs: Observable<any>;
然后在我叫服务器使用的地方:
request1Obs = Service.requests1();
request2Obs = Service.requests2();
request3Obs = Service.requests3();
然后是子项A component
使用此:
ngOninit() {
request1Obs.subscribe(() => {});
}
并且在另一个孩子B component
中使用此:
ngOninit() {
request2Obs.subscribe(() => {});
}
并且在父组件中:
ngOnInit() {
forkJoin(request1Obs, request2Obs).subscribe((data) => {
// All requestes were finished in application
});
}
根据正确的forkjoin用法,您必须在单个来源中使用它。您必须从父母或孩子那里打电话给您的服务。然后,您可以在forkjoin完成之后之间共享数据。
简而言之,在父组件中执行此操作:
response1:any
response2:any
forkJoin(Service.request1(), Service.request2())
.subscribe(Response =>
response1= Response[0];
response2= Response[1];
);
此后,您可以通过多种方式将数据(response2)发送到子组件。
forkJoin(Service.request1(), Service.request2())
.subscribe(([response1, response2]) => console.log(`response1: ${respone1}, response2: ${response2}`));
您可以使用shareReplay,http请求将仅执行一次,然后如果服务是单例,则将为整个应用程序中的任何新订阅缓存forkJoin结果(只需添加{provideIn: 'root'}
。]]
@Injectable({provideIn: 'root'})
class Service {
getRequestsData() {
return forkJoin([...allRequests]).pipe(shareReplay(1))
}
}