使用 rxjs5 获取 BehaviorSubject 当前值的简单方法

Posted

技术标签:

【中文标题】使用 rxjs5 获取 BehaviorSubject 当前值的简单方法【英文标题】:Simple way to get the current value of a BehaviorSubject with rxjs5 【发布时间】:2016-12-11 14:14:54 【问题描述】:

之前在 rxjs4 中有一个在 BehaviorSubject 中调用的方法: getValue() (doc here)。

rxjs5中不再存在此方法。

所以我发现获得 BehaviorSubject 值的唯一解决方案是:

let value;
myBehaviorSubject.take(1).subscribe( (e) => value = e );

这段代码同步运行(我不完全理解为什么,但确实如此......)并获取值。它可以工作,但没有getValue() 存在时那么干净:

let value = myBehaviorSubject.getValue();

为什么 getValue()rxjs5 中被删除了,什么是解决这个问题的最干净的方法?

【问题讨论】:

BehaviorSubject 接口已被简化 - getter 仅称为 .value @arturgrzesiak 我在当前文档中没有找到对此 .value 的任何引用:reactivex.io/rxjs/class/es6/… 文档可能不是最新的,但它仍然有效。也请看这里:reactivex.io/rxjs/test-file/spec-js/subjects/… 感谢您的指点! @Clement 是正确的,这从未添加到文档中,因为它从未打算供消费者使用。任何升级到 6.5.0 的人都会发现它不再工作,因为它已被删除:github.com/ReactiveX/rxjs/issues/5085 【参考方案1】:

正如 cmets 中 artur grzesiak 所指出的,BehaviorSubject 接口已被清理,getter 现在只是 myBehaviorSubject.value

我只是想将其添加为答案,因为我几乎没有阅读原始问题的 cmets,并且会错过正确答案。

【讨论】:

"我只是想将其添加为答案,因为我几乎没有阅读原始问题的 cmets,并且会错过正确答案。" 如果担心的是你重复评论和it's not "your" answer,你总是可以community wiki it(虽然在31票,我理解利他主义是否减弱)。 在我看来,如果有人不理解答案的工作原理,那是 Artur 而不是 Tyson 该评论链接到关于的重大变化,与行为主题无关。 从 RxJS 6.5.4(并期待 7.x)开始,BehaviorSubjects 将支持 .value.getValue() 作为访问当前价值github.com/ReactiveX/rxjs/blob/6.x/src/internal/… 我提交了一份编辑以删除关于 BehaviorSubject.value 被弃用的评论。正如@AdrianBrand 所说,github 讨论是关于of 而不是BehaviorSubject.value 并且将继续在BehaviorSubject中得到支持【参考方案2】:

看一个行为主体的源代码

https://github.com/ReactiveX/rxjs/blob/master/src/internal/BehaviorSubject.ts

它仍然有一个 getValue 方法,它有一个只调用 getValue 的 value 属性,它在 RxJs5 中有。

这是一个使用 RxJs5 的 StackBlitz。

https://stackblitz.com/edit/typescript-gcbif4

所有谈论 6.5.0 中的重大变化的 cmets 都链接到 cmets 关于 observables 的非行为主题。

【讨论】:

以上是关于使用 rxjs5 获取 BehaviorSubject 当前值的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

rxjs5合并和错误处理

将flutter_bloc与tabview一起使用

在 RxJS 5.0 中找不到“combineLatest”

rxjs 5 发布重播引用计数

RxJS 5,将 observable 转换为 BehaviorSubject(?)

具有 Firebase 身份验证的拦截器