我有一个getDimensions方法,它返回一个Observable<string[]>
尺寸.service.ts

public getDimensions(id: string): Observable<string[]> {
    return this.service.loadDimensions(id);
}

重装机服务
public update(idsToUpdate: string[]): void {

    idsToUpdate.map(id => this.dimensionService.getDimensions(id)).pipe(
        map(
             newDimensions => this.updateDimensions(newDimensions)
        )
    ).subscribe(); // ToDo: unsubscribe

}

然后在应用程序的另一部分,我在update方法中调用这个方法。问题是,我不知道如何正确地取消订阅getDimensions。一个可能的解决方案是,创建一个Subscription然后在OnDestroy中调用unsubscribe,但对我来说这不是一个好的解决方案:
这是一个服务,我正在整个应用程序中使用它,因此OnDestroy钩子永远不会出现
我每update秒调用n方法,因此每n秒都会有一个新订阅
可能的解决方案:(不好)
重装机服务
private subscriptions: Subscription = new Subscription();

...
...

public update(idsToUpdate: string[]): void {

    const sub = idsToUpdate.map(id => this.dimensionService.getDimensions(id)).pipe(
        map(
             newDimensions => this.updateDimensions(newDimensions)
        )
    ).subscribe(); // ToDo: unsubscribe

    this.subscription.add(sub);

}

...
...

public onDestroy(): void {
    this.subscription.unsubscribe();
}

编辑:
正如@jgerstle在评论中提到的,如果Observable完成了(这是我的情况),就不需要取消订阅。

最佳答案

如果你想退订时,你得到的数据或可观测完成

public update(idsToUpdate: string[]): void {

    const sub = idsToUpdate.map(id => this.dimensionService.getDimensions(id)).pipe(
        map(
             newDimensions => this.updateDimensions(newDimensions)
        )
    ).subscribe(() => sub.unsubscribe() ); // or you can use complate

}

关于angular - 如何正确退订这种可观察的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53113746/

10-11 14:46