【问题标题】:How to subscribe to some Observable requests?如何订阅一些 Observable 请求?
【发布时间】:2020-04-26 16:10:48
【问题描述】:

我有一些返回 Observable 数据的 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从父组件调用,另一个request2在子组件内。

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

我想列出所有 Observable,例如:

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


    【解决方案1】:

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

    简而言之,在父组件中这样做:

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

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

    【讨论】:

    • 我没有得到这个
    • 您可以从父组件调用您的所有请求并将该数据存储在父组件中,然后使用事件发射器或输出将该数据进一步发送到组件 A 和组件 B
    • 我需要等待直到所有请求都完成,但是 forkJoin 推送了每个请求的最后一个值
    • forkjoin 的官方文档也是这么说的。它返回传递给它的每个可观察对象的最后一个值。请找到文档链接:reactivex.io/rxjs/class/es6/…
    • 问题是有些请求在子组件中发送,有些在其他地方。如果都完成了怎么听?如果我这样做 forJopin() 它也会调用相同的方法
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      forkJoin(Service.request1(), Service.request2())
          .subscribe(([response1, response2]) => console.log(`response1: ${respone1}, response2: ${response2}`));
      

      【讨论】:

      • 是的,但它应该是可观察的列表吗?你能看到我的更新吗
      猜你喜欢
      • 2019-07-14
      • 2023-03-28
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      相关资源
      最近更新 更多