【问题标题】:How to wait for observable resolve from different components in Angular如何等待 Angular 中不同组件的可观察解析
【发布时间】:2018-06-27 20:08:27
【问题描述】:

我有一个关于 observables 的问题。

假设我有一个带有可观察对象的服务,并且我有两个不同的组件订阅该可观察对象。 Observable 本身执行后端查询。

目前我有一个问题,即使用相同的输入,不同组件中的两个 observables 会发出具有相同输入参数的独立网络请求。

有没有办法做到这一点,如果这两个 observable 在其中一个执行时调用,第二个将等待第一个完成并使用该结果?

我目前正在使用 httpClient 和 angular 5

欢迎任何建议或设计模式:)

【问题讨论】:

标签: angular asynchronous angular-httpclient


【解决方案1】:

请以单例方式使用服务。这可以通过在根模块的提供者列表中配置服务来完成。

在服务中,有一个 observable 作为变量。

从两个组件调用相同的服务方法。

服务方法应该检查是否已经设置了可观察变量。如果设置,则返回变量。如果未设置,则调用httpclient函数并将结果分配给可观察变量,并返回相同的值。

我希望这个逻辑应该有效。

【讨论】:

    【解决方案2】:

    这实际上是HTTP observables 的正常行为,因为它们是冷的。 当一个冷observable 有多个subscribers 时,为每个subscriber 重新发出整个数据流。每个订阅者都变得独立并获得自己的数据流

    为避免重复 HTTP 请求,您可以使用 shareReplay 运算符。

    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    import {Observable} from 'rxjs';
    import {shareReplay,tap}from 'rxjs/operators';
    @Injectable()
    export class ShareService {
    
    public response$:Observable<any>;
    constructor(private httpc:HttpClient)
    {
      this.sendRequest();
    }
    public sendRequest()
    {
    
     this.response$= this.httpc.get('url').
        pipe(tap(res=>{console.log('called');return res;}),shareReplay(1))
    
    }
    fetchData()
    {
    
    return this.response$;
    }
    }
    

    组件1:

     constructor(service:ShareService)
      {
    
         service.fetchData().subscribe(result=>{
         console.log(result);
    
        })
    

    组件2:

     constructor(service:ShareService)
      {
    
         service.fetchData().subscribe(result=>{
         console.log(result);
    
        })
    

    Further Reading

    Live Demo

    【讨论】:

      【解决方案3】:

      我要感谢所有建议的答案,因为它们引导我更深入地查看 RXJS 文档。

      所以我发现的和其他人之前在这里基本上说的,observable 是冷的。所以这意味着每次订阅 observable 时都会发送一个新请求。

      为了让它变热,所以订阅者会等待我使用 RxJS 中的 share() 运算符的响应。

      请从以下博客文章中获得更详细的用例和解释:

      https://blog.strongbrew.io/how-share()-can-reduce-network-requests/https://blog.novanet.no/angular-pitfall-multiple-http-requests-with-rxjs-and-observable-async/

      再次感谢 Vikas 和 Rakesh 为我指明了正确的方向 :)

      【讨论】:

        猜你喜欢
        • 2019-03-25
        • 2020-10-28
        • 1970-01-01
        • 2017-10-12
        • 2018-01-03
        • 1970-01-01
        • 2012-05-04
        • 2012-07-27
        • 1970-01-01
        相关资源
        最近更新 更多