首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解RxJS BehaviorSubject

了解RxJS BehaviorSubject
EN

Stack Overflow用户
提问于 2021-01-14 18:54:51
回答 4查看 262关注 0票数 0

我们尝试使用BehaviorSubject在多个组件之间共享API数据。在我的组件上,我触发了一个HTTP请求,并在返回响应后更新主题。

component.ts

代码语言:javascript
复制
onClick() {
    this.service.getCompanies();
    this.service.companiesList$.subscribe(companies => {
        console.log(companies.length); // 0 and then 1
    });
}

service.ts

代码语言:javascript
复制
companiesList$ = new BehaviorSubject([]);

getCompanies() {
    return this.http.get(myUrl).subscribe((res: any) => {
        this.companiesList$.next(res.data);
    });
}

在请求完成后,如何才能仅访问BehaviourSubject发出的最后一个值?

EN

回答 4

Stack Overflow用户

发布于 2021-01-14 19:24:05

也许您可以尝试以下操作,将http请求的观察值保存在服务中,并对其应用shareReplay(1)运算符。然后,您可以在您的组件中使用它,如下所示:

component.ts

代码语言:javascript
复制
onClick() {
    this.service.getCompanies().subscribe(companies => {
        console.log(companies);
    });
}

service.ts

代码语言:javascript
复制
$companies =  this.http.get(myUrl).pipe(shareReplay(1));

getCompanies() {
    this.companies$;
}
票数 1
EN

Stack Overflow用户

发布于 2021-01-14 19:02:57

虽然从技术上讲,您可以使用companiesList$.getValue(),但我建议您不要使用subscribe()在您的组件中创建订阅,而是使用AsyncPipe (ref)。它可能看起来像这样:

component.ts

代码语言:javascript
复制
companies$ = this.service.companiesList$.asObservable();

onClick() {
  this.service.getCompanies();
}

component.html

代码语言:javascript
复制
<div *ngIf="companies$ | async as companies">
  <!-- your stuff -->
  {{ companies.length }}
</div>
票数 0
EN

Stack Overflow用户

发布于 2021-01-14 20:58:45

要获得最后一个发射值,请使用以下命令:

companiesList$.getValue()

如果要在流中使用它,请使用withLatestFrom operator

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65717667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档