繁体   English   中英

使用Subject和Observable有什么区别,每个使用的用途是什么?

[英]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制作的观察者之间是否存在另一个差异

SubjectObservableObserver 这使得它很容易使用,因为你得到一个Observer的引用,你可以在你的代码中传递并从你想要的任何地方发出项目。 但是,当您从Observable的声明性定义切换到命令式定义时,这会大大增加代码的错误倾向。

一般来说,您应尽可能使用Observable创建函数( offromcreate )。 我会说大多数情况都可以在没有主题的情况下解决。 然而,有一个陡峭的学习曲线,因为您必须了解大多数Observable创建函数才能遵循该模式。

对于习惯性地编码的开发人员来说,主题可能更自然(即:使用像JS这样的脚本语言),因为它类似于回调函数的简单包装器对象。 有人可能会问,如果不可取,​​为什么还有一个主题。

根据这篇文章 ,主题仅用于一个案例:

在没有任何直接外部来源的情况下,以强制性和有状态的方式生成热观察。

简而言之,这意味着:当您没有任何外部源(如Observable,Promise或Event)时使用Subject,并且需要从函数内部多播类的状态。 但是,您不应该将该主题暴露给他人!

我建议你阅读这篇文章,它会清理一些事情。

Subject实现了Observable和Observer接口。

实现Observable接口意味着您可以subscribe Subject。

实现Observer接口意味着,除了其他功能之外,使用Subject可以调用方法next errorcomplete

如果要以编程方式控制Observable的事件流,则可以使用Subject创建Observable,这是您提到的管理CB之间的通信的情况。

SubjectObservable之间的关系如下:

class Observable {}

class Subject extends Observable {}

Subject实现Subscriber接口。 所以你可以使用Subject作为SubscriberObservable不能像这样使用):

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM