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。

写段代码

javascript
const currentUser$ = new BehaviorSubject(null); currentUser$.next(user); currentUser$.subscribe(render);
标签:Rxjs