完成后我应该取消订阅吗?

Bob*_*bby 7 rxjs

我有一个关于 observable 的快速问题。

我有以下可观察的:

  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();
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

在一个组件中,我有:

this.service.getElevation(value).subscribe((e) => {});
Run Code Online (Sandbox Code Playgroud)

我的问题是,这是一个一次性的observable,所以我完成后,完成后会自动关闭订阅吗?或者,我是否也必须这样做:

const sub = this.service.getElevation(value).subscribe((e) => {sub.unsubscribe();});
Run Code Online (Sandbox Code Playgroud)

Wil*_*lor 6

在您的情况下,您不需要取消订阅。

当您调用 时,所有观察者都将自动取消订阅complete。也就是说,您可能希望实现您的消费(组件)代码来处理将来服务的实现可能发生变化的可能性。

您可以通过使用take将在发出第一个值后取消订阅的运算符来执行此操作:

this.service.getElevation(value).pipe(take(1)).subscribe((e) => {});
Run Code Online (Sandbox Code Playgroud)


Adr*_*and 5

您不应该在订阅中取消订阅,如果可观察对象立即发出,则 sub 是未定义的。

如果你想要一个自我取消订阅的 observable,你可以使用 takeUntil

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

  • 不同的是,你可以控制何时调用finalize,通常是在ngOnDestroy中。take 1 的问题是你不能保证 observable 已经发射并且可能会在你期望的时间后触发。在这种情况下,它基本上是等效的,但是对 Finalize 的调用通常应该在解构函数中进行。 (2认同)