5月30日 21:21
RxJS 中 Subject、BehaviorSubject、ReplaySubject 和 AsyncSubject 怎么选?
Subject 是既能订阅又能 next 的 Observable,常用来把外部事件推给多个订阅者。Subject 不保存历史值;BehaviorSubject 保存当前值,新订阅者立刻拿到;ReplaySubject 可以回放一段历史;AsyncSubject 只在 complete 时发出最后一个值。选型时先问:新订阅者要不要旧值,要几个旧值,结果是不是只有完成后才有意义。
追问
BehaviorSubject 为什么适合状态?
状态通常需要当前值,比如用户信息、主题配置、表单快照。它要求初始值,所以你必须明确空状态是什么。
ReplaySubject 有什么边界?
ReplaySubject 可以保留多个值或一段时间窗口。如果不设置 bufferSize 或 windowTime,历史值可能越攒越多。
AsyncSubject 现在还常用吗?
比较少,因为很多只取最终结果的场景已被 Promise 或 lastValueFrom 覆盖。它适合只关心完成后最后值的过程。
Subject 当事件总线有什么坑?
全局事件总线会让数据流来源变模糊。更稳的做法是封装 Subject,只暴露 asObservable。
写段代码
javascriptconst currentUser$ = new BehaviorSubject(null); currentUser$.next(user); currentUser$.subscribe(render);