我有一个关于 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)
在您的情况下,您不需要取消订阅。
当您调用 时,所有观察者都将自动取消订阅complete。也就是说,您可能希望实现您的消费(组件)代码来处理将来服务的实现可能发生变化的可能性。
您可以通过使用take将在发出第一个值后取消订阅的运算符来执行此操作:
this.service.getElevation(value).pipe(take(1)).subscribe((e) => {});
Run Code Online (Sandbox Code Playgroud)
您不应该在订阅中取消订阅,如果可观察对象立即发出,则 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)
| 归档时间: |
|
| 查看次数: |
1670 次 |
| 最近记录: |