完成后我应该退订吗?

时间:2019-06-26 07:41:35

标签: rxjs

我对可观察性有一个快速的疑问。

我有以下观察点

  getElevation(pos: Cartographic): Observable<Cartographic> {
    return new Observable(observer => {
      const promise = Cesium.sampleTerrain(this.terrainProvider, 11, Cesium.Cartographic(pos.longitude, pos.latitude))
      Cesium.when(promise, (updatedPositions) => {
        observer.next(updatedPositions);
        observer.complete();
      });
    });
  }

在组件中,我有:

this.service.getElevation(value).subscribe((e) => {});

我的问题是,这是一个可观察的拍摄,所以我刚完成,完成会自动关闭订阅吗?或者,我是否也必须这样做:

const sub = this.service.getElevation(value).subscribe((e) => {sub.unsubscribe();});

3 个答案:

答案 0 :(得分:2)

您不应该取消订阅,因为可观察对象会立即发出,然后未定义sub。

如果您希望观察到自己可以退订,则可以使用takeUntil

finalise = new Subject();
this.service.getElevation(value).pipe(takeUntil(finalise)).subscribe((e) => { 
  finalise.next();
  finalise.complete();
});

答案 1 :(得分:2)

对于您而言,您无需退订。

当您致电complete时,所有观察者将自动取消订阅。就是说,您可能希望实现您的使用方(组件)代码来处理将来服务的实现可能更改的可能性。

您可以使用take运算符来执行此操作,该运算符将在发出第一个值后退订:

this.service.getElevation(value).pipe(take(1)).subscribe((e) => {});

答案 2 :(得分:1)

简要说明:

  • 尝试通过操作员(例如takeUntil)来控制订阅。
  • 发件人(主题)完成后,您无需退订。
  • 对于您来说,由于getElevation函数返回的发件人在一次发送值后便完成了自身操作,因此您无需使用任何运算符或自行取消订阅即可。

所有您需要做的:this.service.getElevation(value).subscribe((v) => // do what you want);