为什么我的Angular / Rxjs6.5 shareReplay(1)不起作用?

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

我的服务类别中有非常简单的代码:

userContext$ = this.http.post<UserContext>(this.userContextService, {}).pipe(
    shareReplay(1),
    tap((val: UserContext) => (this.userContext = val))
  );

这被两次调用,首先在页眉中,然后在正文中:

changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HeaderComponent{

  userContext$ = this.userContextService.userContext$;

第二次:

    export class PortfolioComponent {

  userContext$ = this.userContextService.userContext$;

但是这似乎不起作用,在“网络”选项卡中,我始终有2个呼叫,即使我进行Console.log,它也会被记录两次:

enter image description here

在某些时候它运行良好,但是其他一些修改使它搞砸了。

感谢您的帮助。

angular typescript functional-programming rxjs6 rxjs-observables
1个回答
0
投票

先生,

想通过解释来进一步解决问题,问题出在我的服务实例上。

[基本上,userContext是一个单例类(具有对providerIn:根的装饰器),并且直接在PortfolioComponent(PC)内部调用,以某种方式(PC),它也在服务类中,而该类也没有全局作用域,因此如果将其标为PC,则它是提供者:[PC服务等级]。这迫使cli在每次PC调用它时都创建一个userContext的新实例。

我通过在PC服务类中移动userContext调用来解决它,如下所示:

 providers: [PortfolioService],
})
export class PortfolioComponent {

  welcomeTitle: string = lables.welcomeTitle;
  active = 1;

  userId$ = this.portfolioService.userId$;
  holdingData$ = this.portfolioService.holdingData$;
  userContext$ = this.portfolioService.userContext$;
  userAnnouncements$ = this.portfolioService.userAnnouncements$;

和在PortfolioService内部

  userContext$ = this.userContextService.userContext$;
  userAnnouncements$ = this.userContextService.userAnnouncements$;

  constructor(
    private http: HttpClient,
    private userInfoService: UserInfoService,
    private userContextService: UserContextService
  ) {}

我只花了6个小时和200克血(它被吸住了)就知道了。

同时感谢@AndreiGătej与我一起度过的时间。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.