我有一个关于可观察性的快速问题。
我有以下可观察的:
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()
行,则必须在失败的情况下取消订阅。