是否应该保留对可观察量的引用,或者单独进行订阅

时间:2018-05-29 04:50:32

标签: angular garbage-collection observable rxjs5 subscription

我最近遇到过这个(Angular)代码:

ngOnInit() {
  this.subscriptions.add(
    this.createSomeObservable()
      .subscribe(v => console.log('v=', v))
  );
}

这是安全还是应该将this.createSomeObservable()中返回的observable作为成员存储在类中以防止被垃圾收集?

如果重要的话,this.createSomeObservable()实际上是来自ngrx商店的选择。

2 个答案:

答案 0 :(得分:0)

如果使用ngOnDestroy()破坏组件/指令,则由于情况可能会导致内存泄漏,而observable未取消订阅时。所以我们必须更多地关注正确的订阅取消订阅,而不是保留observable。这是更好的解决方案。

您希望尽可能长时间地保留observable,所以最简单的方法是将您的subscribe()观察者移动到某种可注射提供者service。你can check some docs about services here.不幸的是,在你正确取消订阅(毁掉它)之前,它会长寿并繁荣 - 内存泄漏的风险仍然存在。

您可以做的是在完成使用您的observable时正确取消订阅。可能的解决方案很少,但我推荐的解决方案是使用async pipe。它会将unsubscribe问题移到角度,就像其他任何人都知道何时取消订阅一样。还有其他方法,例如takeUntil(),但您可以自己进行一些研究,例如here

如果你真的想要关注不在observable本身上的值 - 你可以将它们从父对象传递给子对象,反之亦然。 Here's some reading about component interactions

TLDR;不要保留可观察量 - 在需要时专注于正确的订阅和取消订阅。

编辑:我确实误解了OP问题 - 所以我将举例说明如何在subscribe中存储我们的值(类型为observable):

@Component({
    selector: 'app-user-settings',
    templateUrl: './user-settings.component.html'
})
export class UserSettingsComponent {

   userSettings$: Observable<UserSettings>;
   permissions$: Observable<UserSettingsPermissions>;

constructor(private store: Store<fromUserSettings.State>) {
    this.UserSettings$ = store.select(fromUserSettings.getUserSettings);
    this.permissions$ = store.select(fromUserSettings.getPermissions);
}

onSaveSettings(formGroup: FormGroup): void {
    this.store.dispatch(new userSettings.PostUserSettings(formGroup));
 }
}

我将我的observable分配给可用包的局部变量(在HTML中使用它们)。所以是的,如果您需要在组件周围使用它们您可以将它们存储在一些变量中。只要组件没有被销毁,就可以使用这种方式从商店获取的可观察量。希望能够照亮我的答案。

PS。我在这里使用ngrx商店,所以它可能会有所帮助。

答案 1 :(得分:0)

在您不取消订阅observable之前,数据不会被垃圾收集。但是,如果它是我们正在讨论的HTTP observable,它会在单个响应之后取消订阅。所以在这种情况下你可能不得不处理垃圾收集。否则,在您取消订阅之前,垃圾收集不应以任何方式影响您。 希望有所帮助!!