javascript - 使用 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 之间是否存在其他差异?
解决方案
ASubject
既是Observable
又Observer
是同时。这使得使用它变得如此诱人,因为您获得了对 an 的引用Observer
,您可以在代码中传递并从任何您想要的地方发出项目。但是,当您从 Observable 的声明式定义切换到命令式定义时,这会大大增加代码的错误倾向。
一般来说,您应该尽可能使用 Observable 创建函数(of、from、create)。我想说大多数情况可以在没有主题的情况下解决。但是有一个陡峭的学习曲线,因为您必须了解大多数 Observable 创建函数才能遵循该模式。
对于习惯于命令式编码(即:使用像 JS 这样的脚本语言)的开发人员来说,主题可能会更自然,因为它有点类似于回调函数的简单包装对象。有人可能会问,如果它不受欢迎,为什么还要有一个主题。
根据这篇文章,主题只能在一种情况下使用:
在没有任何直接外部源的情况下,命令式和有状态地生成一个热可观察对象。
简而言之,这意味着:当您没有任何外部源(如 Observable、Promise 或 Event)并且需要从函数内部多播类的状态时,请使用 Subject。但是,您不应该将该主题暴露给其他人!
我建议你读这篇文章,它会澄清一些事情。
推荐阅读
- python - 静音和取消静音功能
- android - 使用 Hilt 注入上下文:此字段泄漏上下文对象
- thrift - 如何安装 Apache thrift 0.13.0
- ffmpeg - 如何指定 .webm 转换的有损/无损程度(在 ffmpeg 中)?
- android - 如何修复 Android Studio 模拟器中的错误点击位置?
- python - 当一次通过一个时,Cartopy 在两极绘制额外的分数
- javascript - 将 eventListener 附加到单击另一个按钮时将出现的按钮?
- asp.net - 使用 IIS 和 Windows 身份验证时,什么会导致不正确的用户名?
- javascript - 在 Typescript 中使用 react-dates
- javascript - 如何异步构建数据源?