![](/img/trans.png)
[英]What is the difference between Observable and a Subject in rxjs?
[英]What are the differences between using a Subject and an Observable, and what are the uses for each?
我已经了解了制作Observable的两种不同方法。 第一个是主题,如下:
// file A
const message$ = new Subject();
// file B
message$.subscribe( (message) => console.log(message) );
// file C
message$.next("Hello there!");
这种创建Observable的方法允许我有一种方法将数据从文件B交换到文件C.
第二种方式是通过Observable类,如下所示:
// file A
const click$ = new Observable( function(observer) {
//Alternatively, I can use Observable.create()
document.addEventListener('click', (e) => observer.next(e));
});
// file B
click$.subscribe( (cl) => console.log(cl) );
我可以在Subject方式和Observable方式之间收集的主要区别在于我不确定如何在某个文件C与Observable的订阅者之间进行某种通信。 基本上,单击$没有.next()
方法,观察者方法在我们传递给observable的函数中。
除了这种行为差异之外,使用Subject制作的观察者与使用Observable制作的观察者之间是否存在另一个差异
Subject
是Observable
和Observer
。 这使得它很容易使用,因为你得到一个Observer
的引用,你可以在你的代码中传递并从你想要的任何地方发出项目。 但是,当您从Observable的声明性定义切换到命令式定义时,这会大大增加代码的错误倾向。
一般来说,您应尽可能使用Observable创建函数( of , from , create )。 我会说大多数情况都可以在没有主题的情况下解决。 然而,有一个陡峭的学习曲线,因为您必须了解大多数Observable创建函数才能遵循该模式。
对于习惯性地编码的开发人员来说,主题可能更自然(即:使用像JS这样的脚本语言),因为它类似于回调函数的简单包装器对象。 有人可能会问,如果不可取,为什么还有一个主题。
根据这篇文章 ,主题仅用于一个案例:
在没有任何直接外部来源的情况下,以强制性和有状态的方式生成热观察。
简而言之,这意味着:当您没有任何外部源(如Observable,Promise或Event)时使用Subject,并且需要从函数内部多播类的状态。 但是,您不应该将该主题暴露给他人!
我建议你阅读这篇文章,它会清理一些事情。
Subject实现了Observable和Observer接口。
实现Observable接口意味着您可以subscribe
Subject。
实现Observer接口意味着,除了其他功能之外,使用Subject可以调用方法next
error
并complete
。
如果要以编程方式控制Observable的事件流,则可以使用Subject创建Observable,这是您提到的管理C和B之间的通信的情况。
Subject
和Observable
之间的关系如下:
class Observable {}
class Subject extends Observable {}
Subject
实现Subscriber
接口。 所以你可以使用Subject
作为Subscriber
( Observable
不能像这样使用):
const subj = new Subject()
observable.subscribe(subj)
Subject
可以通过调用asObservable
方法隐藏它的Subscriber
接口 - 将Subject
转换为plain Observable
;
我通常在我的代码生成事件时使用Subject
,当我已经有一些事件源时我使用Observable
例如,使用Subject作为队列:
const queue = new Subject();
queue.pipe(
concatMap(doStuff)
).subscribe()
queue.next('do this')
queue.next('do that')
或使用Subject作为信号器来阻止其他Observable
const stop = new Subject();
someObservable.pipe(
map(x => x + 1)
takeUntil(stop)
)
// somewhere in my code
stop.next()
除了这种行为差异之外,使用Subject制作的观察者与使用Observable制作的观察者之间是否存在另一个差异
我不会说有分歧-它更像Subject
是平淡的补充Observable
-让我们在需要的时候做更多的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.