首页 > 解决方案 > 使用 Subject 和 Observable 有什么区别,各自的用途是什么?

问题描述

我已经了解了两种不同的方法来制作 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 的订阅者之间进行某种通信。基本上,click$ 没有.next()方法,观察者方法在我们传递给 observable 的函数中。

除了这种行为差异之外,使用 Subject 制作的 observables 和使用 Observable 制作的 observables 之间是否存在其他差异?

标签: javascriptrxjsreactivex

解决方案


ASubject既是ObservableObserver是同时。这使得使用它变得如此诱人,因为您获得了对 an 的引用Observer,您可以在代码中传递并从任何您想要的地方发出项目。但是,当您从 Observable 的声明式定义切换到命令式定义时,这会大大增加代码的错误倾向。

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

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

根据这篇文章,主题只能在一种情况下使用:

在没有任何直接外部源的情况下,命令式和有状态地生成一个热可观察对象。

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

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


推荐阅读