在 ReactiveX 中,Subject 是一个相当重要而且常用的概念。在前端开发中,我们经常会遇到诸如创建可观察对象,组合操作符等任务,这时候就需要用到 Subject。但是,什么是 Subject,它有哪些特点呢?本文就介绍一下 Subject 的相关知识。
Subject 的介绍
Subject 是比较常见的可观察者对象的类型之一。Subject 既可以是可观察对象,也可以是观察者,也就是说可以调用 subject.next() 方法来往 Subject 对象中添加元素数据,并且 Subject 对象会把这些元素发给它的所有订阅者。
可以将 Subject 类比为一个全角色的“广播电视台”,Subject 对象就像是广播电视台的一个信号调度室,在调度室中我们可以收听一个广播信号,也可以向广播信号中添加自己的声音。Subject 对象就像收听者一样,可以设置并订阅其他的可观察对象,并接收数据来在自己实例中发送。
Subject 有多种类型,分别为:
BehaviourSubject:在创建时必须传入一个初始值,可以给订阅者提供没有推送新值时的初始值。
ReplaySubject:可以给一个 Subject 表示最近的推送值的数量,每一个新的订阅者都可以收到这些值。
AsyncSubject:只在源 Observable 完成时推送出衍生 Observable 的最后一个值,或者将源 Observable 发出的错误传播给订阅者。
Subject 的特点
Subject 可以作为可观察对象,也可以作为观察者。
Subject 可以多次触发订阅,每次订阅都会新开一条订阅路径。
Subject 在订阅后才开始推送值,且默认不存储最新的状态。
Subject 推送的值没有延迟,订阅者只要进行订阅就能接收到触发的值。
Subject 可以给多个订阅者发送值,从而实现数据共享。
Subject 的示例代码
以 RxJS 中 Behavior Subject 类型 Subject 举例:
-- -------------------- ---- ------- ------ - --------------- - ---- ------- ----- ---------------- - --- ------------------------- ------------------------------ -- - -------------------- ----- --- -------------------------------- -- ------------------- ------------------------------ -- - -------------------- ----- --- -------------------------------- -- --------------------------
上述代码创建了一个名为 behaviourSubject
的 Behavior Subject 对象,并推送了 初次推送值
。接着,我们给该 Subject 对象进行了两次订阅,在第二次向 Subject 对象中添加值时,这两个订阅者都会同时接收到新的值。接着在第三次向 Subject 对象中添加值时,之前的订阅者和新的订阅者都会一同接收到该值。
总结
本文主要介绍了 Subject 的概念以及如何使用 Subject,以及 Subject 的特点。对于前端开发人员来说,熟练掌握 Subject 而不仅限于使用它,可以更好地理解 ReactiveX 的原理和使用,提高开发效率。在日常开发中,使用 Subject 可以更好的实现数据共享和状态管理,也可以帮助我们更好的编写高效的代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651d0a2a95b1f8cacd48e263