PAYATHON 2026

BehaviorSubject 完成后订阅为何不传递当前值?

数据阿明

结论

执行 bs.subscribe(bs2) 前,bs 已经完成。虽然 BehaviorSubject 还保存着最后一个值 3,但完成后再订阅它,订阅者不会收到这个值,所以 bs2 仍为 5。

原因

of(1, 2, 3) 会同步发出三个值,然后立即完成。someStuff.subscribe(bs) 将这些值传给 bs,因此 bs 的最后一个值是 3。of 完成时,bs 也随之完成。

getValue() 仍能读取已完成的 bs 保存的值,但这不表示它会把 next 发送给新订阅者。此时订阅 bs,新订阅者会收到完成通知,而不会收到当前值。作为订阅者的 bs2 也会随之完成,但它保存的值仍是 5。

如何让 bs2 收到当前值

在 bs 完成前订阅它即可。例如:

const bs = new BehaviorSubject(4);
const bs2 = new BehaviorSubject(5);

bs.next(3);
bs.subscribe(bs2);

console.log(bs2.getValue()); // 3

这段代码在 bs 仍处于活动状态时进行订阅,因此 bs 会把当前值 3 发给 bs2。

如果只想读取已完成的 bs 保存的最后一个值,可以直接调用:

console.log(bs.getValue()); // 3

这只会读取 bs 保存的值,不会将它发送给新的订阅者。

备注:内容仅供参考。