Rxjs -- (pluck、distinctUntilChenged、distinct)
碎碎念:知识点梳理归纳,如果有什么不对的感谢大家指正一起学习!
- 版本为6
pluck
- 把上游数据中特定字段的值"拔"出来
- 将每个源值(对象)映射成它指定的嵌套属性。
- 选择属性来发出值
例1:提取name属性的值
例1:提取name属性的值。如果没有就返回undefined
distinctUntilChenged
- 当当前值与前一个值不同时才发出
- 返回 Observable,它发出源 Observable 发出的所有与前一项不相同的项(与前一值比较)
- 这个操作符要保存上游产生的一个数据就足够(没有distinct潜在的内存泄露的问题)
- 可选参数
compare
(可选比较函数,用来检验当前项与源中的前一项是否相同。) - distinctUntilChanged 默认使用 === 进行比较, 对象引用必须匹配!
- 函数签名: distinctUntilChanged(compare: function): Observable
例1:只保留与前一个值不相同的值
例2:用可选参数比较两个对象是否相等
distinct
- 只返回没有出现过的数据
- 它发出由源 Observable 所发出的所有与之前的项都不相同的项
- 长时间运行的 distinct 操作也可能会导致内存泄露(可配合使用flushes参数)
可选参数:
-
keySelector:
function, 可选函数,用来选择某个键的值以检查是否是不同的。 -
flushes:
Observable,可选 Observable,用来清空操作符内部的 HashSet 。
工作方式
在数据很多的情况下,可能造成内存泄漏。先订阅上游的Observable对象,然后维护一个“唯一数据集合”,记录上游推送下来的所有唯一数据。每产生 一个新数据,distinct查看是否存在在该列表。存在就舍弃,不存在就添加到列表并传给下游。(在数据量大的时候此列表会越来越大)
例1:
例2:keySelector,第一个可选参数。定制distinct应该比对什么样的属性
例3:flushes,第二个可选参数,可以是一个对象,每当这个流产生数据的时候,distinct就清空“唯一数据集合”,一切重来,避免数据泄露
总结:
(emm,还没能理解这个的应用场景,先记录一波吧)
上游会产生8个唯一的数据,第二个参数每500毫秒就会产生一个数据,这个数据是什么值不重要,重要的是他会清空distinct以前积压的所有唯一数据