我对可观察性有一个快速的疑问。
我有以下观察点
: 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();});
答案 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);