如何订阅一些 Observable 请求?

How to subscribe to some Observable requests?

我有一些 returns 可观察数据的 http 方法。所有方法都投入使用:

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 从 parent 组件调用,另一个 request2 在 child.

我需要 joinFork 来确保它们完成?

我想列出所有 Observables,例如:

export let request1Obs: Observable<any>;
export let request2Obs: Observable<any>;
export let request3Obs: Observable<any>;

然后在调用服务器的地方使用:

request1Obs = Service.requests1();
request2Obs = Service.requests2();
request3Obs = Service.requests3();

然后 child A component 使用这个:

ngOninit() {
    request1Obs.subscribe(() => {});    
}

在另一个 child B component 中使用这个:

ngOninit() {
    request2Obs.subscribe(() => {});    
}

并且在 parent 组件中:

ngOnInit() {
   forkJoin(request1Obs, request2Obs).subscribe((data) => {
   // All requestes were finished in application
});
}
forkJoin(Service.request1(), Service.request2())
    .subscribe(([response1, response2]) => console.log(`response1: ${respone1}, response2: ${response2}`));

根据 forkjoin 的正确用法,您必须在单一来源中使用它。您必须从 parent 或 child 调用您的服务。然后forkjoin完成后就可以在中间共享数据了。

简而言之,在 Parent 组件中执行此操作:

response1:any
response2:any
forkJoin(Service.request1(), Service.request2())
    .subscribe(Response =>
response1= Response[0];
response2= Response[1];
 );

在此之后,您可以通过多种方式将数据(response2)发送到您的 child 组件。

你可以使用shareReplay,http请求将只执行一次然后forkJoin结果将被缓存用于整个应用程序中的任何新订阅,如果服务是单例(只需添加{provideIn: 'root'}).

@Injectable({provideIn: 'root'})
class Service {
    getRequestsData() {
        return forkJoin([...allRequests]).pipe(shareReplay(1))
    }
}