使用async pipe订阅BehaviorSubject(未在.ts文件订阅),组件销毁需完成吗?
BehaviorSubject配合async pipe时,组件销毁需不需要调用complete?
核心结论:不需要主动调用complete(),但得分BehaviorSubject的归属场景来看
为什么不用?
Angular的async pipe本身就自带订阅管理能力:当组件销毁时,它会自动取消对BehaviorSubject的订阅,完全不会造成内存泄漏。而complete()的作用是终止整个BehaviorSubject的数据流,让所有订阅它的地方都收到完成通知,这和组件销毁时清理自身订阅根本不是一回事。
分场景说清楚
BehaviorSubject是组件内部私有的
比如组件里自己new BehaviorSubject(xxx),这种情况下组件销毁后,这个BehaviorSubject因为没有其他地方引用,会被JS垃圾回收机制自动处理。调用complete()不是必须的,纯属于多此一举。BehaviorSubject是全局服务/跨组件共享的
这种情况绝对不能在单个组件销毁时调用complete()!因为其他组件可能还在依赖这个数据流,你一调用整个流就终止了,直接影响其他业务。此时只需要靠asyncpipe自动清理当前组件的订阅就行,全局的BehaviorSubject应该在服务本身销毁或者整个应用不再需要它的时候,再考虑调用complete()。
额外提醒
如果你是手动订阅BehaviorSubject(没用到async pipe),那必须在组件销毁时手动取消订阅(比如用takeUntil或者直接unsubscribe()),但你的场景全程用async pipe,完全不用管这茬。
内容的提问来源于stack exchange,提问作者Dvir Avrahami
相关产品推荐
相关产品推荐

