Angular/RxJs - 使用 take(1) 取消订阅依赖的 http 服务?

标签 angular service rxjs take

--Component.ts--

 getGenCoreLabs() {
    this.checkinService
      .getLaboratories()
      .pipe(
        switchMap(outerResp => {
          const total = outerResp.headers.get(outerResp.headers.get('total'));
          return this.checkinService.getGenCoreLabs(total);
        }),
        take(1)
      )
      .subscribe(resp => {
        this.apiResponse = resp;
        this.areaList = this.apiResponse.map(labName => {
          return labName.Name;
        });
        this.areaListIds = this.apiResponse.map(labGuid => {
          return labGuid.Guid;
        });
      });
  }

在我的 component.ts 文件中的上面的代码中,单个 take(1) 是否足以取消订阅依赖的 http 服务?或者我是否也必须在 service.ts 文件中的第二个服务(getGenCoreLabs)内调用 take(1) ? (请参阅以下代码以供引用)

--Service.ts--

public getGenCoreLabs(total: number): Observable<CoreLaboratoryData> {
    const url = `/core/laboratories?per-page=${total}`;
    return this.httpService.get(url).pipe(take(1));
  }

最佳答案

当可观察值是有限序列时,您不需要取消订阅。 HTTP 请求就是这种情况,它只会发出一个值。

timer(1000) 的情况相同,仅在 1000 毫秒后发出一个值。

有关您应该取消订阅或不需要取消订阅的不同情况的更多详细信息,请查看When to Unsubscribe in Angular作者:Netanel Basal。

所以你的代码可能是:

getGenCoreLabs() {
  this.checkinService.getLaboratories().pipe(
    switchMap(outerResp => {
      const total = outerResp.headers.get(outerResp.headers.get('total'));
      return this.checkinService.getGenCoreLabs(total);
    }),
  ).subscribe(resp => {
    ...
  })
}

关于Angular/RxJs - 使用 take(1) 取消订阅依赖的 http 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60648549/

相关文章:

angular - 如何使用sidenav的EventEmitter(onClose)

node.js - Angular 错误 : Node Sass version 6. 0.0 与 ^4.0.0 不兼容。 Angular

Android,我的服务无法启动

windows - SC删除不删除服务

Angular 4 : Route Transition Loading

angular - 升级到 Angular Material 6.0.0 时出错

Angular "Must be imported or local"错误

java - 为什么运行 Java 测试时 BundleContext 为 null?

angular - 在自动保存场景中以何种顺序使用哪些 rxjs 运算符

rxjs - 如何知道 Rx.Observable.combineLatest 中哪个可观察触发变化