如何订阅一些可观察的请求?

问题描述 投票:1回答:3

我有一些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
});
}
angular rxjs angular6 angular8
3个回答
1
投票

根据正确的forkjoin用法,您必须在单个来源中使用它。您必须从父母或孩子那里打电话给您的服务。然后,您可以在forkjoin完成之后之间共享数据。

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

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

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


0
投票
forkJoin(Service.request1(), Service.request2())
    .subscribe(([response1, response2]) => console.log(`response1: ${respone1}, response2: ${response2}`));

0
投票

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

@Injectable({provideIn: 'root'})
class Service {
    getRequestsData() {
        return forkJoin([...allRequests]).pipe(shareReplay(1))
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.