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

  • 本文关键字:取消 我应该 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();});

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

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

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

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

您不应该在订阅中取消订阅,如果可观察量立即发出,然后 sub 未定义。

如果你想要一个自我取消订阅的可观察量,你可以使用 takeTill

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

简要说明:

  • 尝试使用运算符(如takeUntil)控制订阅。
  • 如果发件人(主题)完成,则无需自行取消订阅。
  • 对于您的情况,由于函数返回的发送方在发出一次值后自行完成getElevation因此您无需使用任何运算符或自己取消订阅即可取消订阅。

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

由于您observer.complete()可观察到的调用,并且您确定它会在成功或失败的情况下完成,那么答案是否定的,无需取消订阅。它会自行完成,这意味着它会自动取消订阅所有订阅者。

如果您不确定您正在使用的第三方库是否会进入observer.complete()行,则必须在失败的情况下取消订阅。

最新更新