【问题标题】:How do I check if an Observable value is populated in Angular?如何检查 Angular 中是否填充了 Observable 值?
【发布时间】:2019-12-12 17:21:22
【问题描述】:

我希望通过单个 HTTP 请求将一些数据集中加载到应用程序中,并希望将这些数据传递给多个单独的组件。我正在使用 BehaviourSubject 类将数据加载到共享服务中的可观察对象中,并在各个组件中订阅它。

共享服务:

  data: Observable<any>;

  load_data(){
  this.http.post('/myAPIMethod', {myInputs}).subscribe(
      res => {
              var dataSource=new BehaviorSubject(res);
              this.data = dataSource.asObservable();
          }, error => {
          console.log(error);
      });
  }

app.component.ts:

constructor(private shared: SharedService) { }
ngOnInit(){
  this.shared.load_data();
  }

myComponent.component.ts

constructor(private shared: SharedService) { }
ngAfterViewInit(){
  this.shared.data.subscribe(
      res => {console.log(res)},
      err => {console.log(err)}
    );
}

由于我的 app.component.ts 和 myComponent.component.ts 文件是异步且独立地加载的,因此即使在应用程序加载数据之前,它尝试订阅 myComponent 中的“数据”Observable 时也会出现错误。我收到未定义错误的订阅(“数据”未定义,它已经在尝试订阅)。

如何在 myComponent 文件中订阅之前检查设置的“数据”Observable 值?

【问题讨论】:

    标签: angular rxjs observable


    【解决方案1】:

    改用Subject

    data = new Subject();
    
    load_data(){
      this.http.post('/myAPIMethod', {myInputs}).subscribe(
          res => {
                  this.data.next(res);
              }, error => {
              console.log(error);
          });
    }
    

    这样你的组件可以在数据返回之前订阅Subject,并在收到http调用时发出数据。

    此外,如果您不打算在订阅函数中操作 DOM / View 元素,请改为在 ngOnInit 中调用它: yourComponet.ts

    ngOnInit(){
      this.shared.data.subscribe(
          res => {console.log(res)},
          err => {console.log(err)}
        );
    

    【讨论】:

    • 成功了。因此,基于此,主题在初始化时发出,即使没有分配任何值(新的主题行),而 observable 实际上需要设置一些值才能访问它?我的理解对吗?
    • 两者都可以在数据返回之前订阅,不同的是subject会多播数据而observable会单播
    • 我使用了主题,因为我虽然你的意图是多播数据,但如果不是你可以在 load_data()return this.http.post('/myAPIMethod', {myInputs}),然后在组件中订阅它
    • 哦,好吧,那么我得到的错误一定是因为已经在其他一些组件中调用了 observable,所以进行相同调用的第二个组件无法再加载数据,正确?现在有了Subject,因为它是多播的,它能够在多个组件中并行加载它,对吗?
    • 是的,我的意图是调用多个组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2020-01-16
    • 2010-11-30
    • 1970-01-01
    • 2021-11-08
    • 2018-11-12
    相关资源
    最近更新 更多