我最近遇到过这个(Angular)代码:
ngOnInit() {
this.subscriptions.add(
this.createSomeObservable()
.subscribe(v => console.log('v=', v))
);
}
这是安全还是应该将this.createSomeObservable()
中返回的observable作为成员存储在类中以防止被垃圾收集?
如果重要的话,this.createSomeObservable()
实际上是来自ngrx商店的选择。
答案 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,它会在单个响应之后取消订阅。所以在这种情况下你可能不得不处理垃圾收集。否则,在您取消订阅之前,垃圾收集不应以任何方式影响您。 希望有所帮助!!