【问题标题】:How to get new updated value from service without subscribing multiple times如何在不多次订阅的情况下从服务中获取新的更新值
【发布时间】:2019-04-10 05:47:05
【问题描述】:

我有一个 Angular 服务,它有一个方法可以在我订阅它时返回详细信息,但是为了获得新值,我必须每次都订阅它,我认为这并不理想。

服务方法的样子,

details.service.ts

getDetails(id: string): Observable<any> {
    return this._http
      .post<any>('baseUrl/detail', { id });
}

组件看起来像,

list.component.ts

getDetails() {
    this._detailsService.getDetails(this.id).subscribe(
      (detail) => {
        // logic here...
      },
      err => console.log(err)
    );
  }

为了获得更新的详细信息,我每次都必须致电getDetails(),这会导致多次订阅。我想避免多次订阅。

【问题讨论】:

    标签: angular rxjs observable


    【解决方案1】:

    我相信您有正当理由在这样的函数中调用服务(可能会刷新数据)。

    因此,我建议您将take(1) 传递给this._detailsService.getDetails(this.id)。在订阅中,您可以将结果绑定回您的组件模型。

    take(1) 会在服务成功后立即取消订阅,因此您不必担心多个尾随订阅。

    例子:

    public details: any;
    getDetails() {
        this._detailsService.getDetails(this.id).pipe(take(1)).subscribe(
          (detail) => {
            // logic here...
            this.details = detail;
          },
          err => console.log(err)
        );
      }
    

    【讨论】:

    • 是的,它很有帮助,但是当用户导航到另一个组件时它仍然会导致内存泄漏,即,订阅在另一个组件上时仍然处于活动状态。我希望在用户导航到另一个组件时完成所有订阅。
    • 如果我错了,请纠正我,所以你是说如果调用 api 并且用户导航到另一个组件,那么你会有内存泄漏吗?如果是这种情况,您可以使用此组合进行改进:在 ngOnDestroy 中,让主题 destroy$ 发出一个值。在 getDetails 的管道内,添加 takeUntil(this.destroy$)。基本上,当您导航到另一个组件时,它将确保所有可观察对象都完成。
    【解决方案2】:

    ngOnInit() 是您执行一次性初始化功能的地方。

    您可以从这里调用所有订阅代码。

    【讨论】:

      【解决方案3】:

      您可以将订阅放在构造函数或 ngOnit 中以避免这种情况。

      constructor() { 
      this._detailsService.getDetails(this.id).subscribe(
                (detail) => {
                  // logic here...
                },
                err => console.log(err)
              );
      }
      or 
      ngOnInit() {
      this._detailsService.getDetails(this.id).subscribe(
                    (detail) => {
                      // logic here...
                    },
                    err => console.log(err)
                  );
        }
      

      【讨论】:

        【解决方案4】:

        ngOnInit() 调用getDetails 函数。它只会执行一次。

        检查角度lifecycle-hooks

        ngOnInit(){
            this.getDetails(); // one time initialize
        }
        
        getDetails() {
            this._detailsService.getDetails(this.id).subscribe(
              (detail) => {
                // logic here...
              },
              err => console.log(err)
            );
          }
        

        【讨论】:

        • 但我必须多次致电getDetails() 以获取更新的详细信息。仅拨打ngOnInit() 无济于事。
        • 如果要调用,则在初始化时调用,否则请在 ngOnIni 内部调用,您可以从 HTML 或某些事件中调用 getDetails
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 2014-07-20
        • 1970-01-01
        相关资源
        最近更新 更多