【问题标题】:Getting data requires two subcriptions获取数据需要两次订阅
【发布时间】:2019-12-22 14:41:23
【问题描述】:

我问这个问题是为了学习。这是我的服务:

export class HomeService {
   private generalstatistics = new ReplaySubject<object>();
   constructor(
   private http: HttpClient
     ) {
    this.data();
  }
  public get generalStatistics(): Observable<object> {
    return this.generalstatistics.asObservable();
  }
  data() {
    this.http.get<any>(`${environment.apiUrl}/home/`)
    subscribe(data => {
    this.generalstatistics.next(data);
  });
 }
}

这是我的第一个订阅。然后在需要该数据的组件中的某个地方我有以下内容:

constructor(private dataSvc: HomeService) {
  this.getData();
}
getData() {
   this.dataSvc.generalStatistics
   .subscribe(data => {
   this.source = data;
 });
}

这是我的第二次订阅。那么仅出于学习目的,是否可以避免两次订阅?

谢谢

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    您不应该在服务内部进行订阅,而是在组件内部执行此操作。

    例如:

    data() {
        return this.http.get<any>(`${environment.apiUrl}/home/`)
    });
    

    并相应地在您需要的地方订阅它!​​

    在组件内部,例如:

    this.homeservice.data().subscribe(...)
    

    如果这样做,您将降低复杂性并减少重复代码。

    希望对你有帮助!

    【讨论】:

    • VS 代码说属性 'subscribe' 在类型 '() => Observable' 上不存在
    • 我正在改变我的服务是这样的: data(): Observable { return this.http.get(${environment.apiUrl}/home/) .map((response: any) = > response.data 任意);错误:类型“Observable 上不存在属性“map”
    • 您需要pipe map 运算符。从 RxJS 6 开始,你不能只把它们放在最后
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2016-09-17
    • 1970-01-01
    • 2017-06-19
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多