Sam*_* I. 5 javascript rxjs reactivex
我已经了解了两种不同的方式来制作 Observable。第一个是一个主题,像这样:
// file A
const message$ = new Subject();
// file B
message$.subscribe( (message) => console.log(message) );
// file C
message$.next("Hello there!");
Run Code Online (Sandbox Code Playgroud)
这种创建 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) );
Run Code Online (Sandbox Code Playgroud)
我可以收集到的主题方式和可观察方式之间的主要区别是,我不确定如何在某个文件 C 与可观察的订阅者之间进行某种通信。基本上,click$ 没有.next()方法,观察者方法在我们传递给可观察对象的函数中。
除了这种行为上的差异之外,使用 Subject 制作的 observable 和使用 Observable 制作的 Observable 之间还有另一个区别吗?
ASubject既是又Observable是Observer同时。这使得它很容易使用,因为您可以获得对 an 的引用,Observer您可以在代码中传递该引用并从您想要的任何地方发出项目。然而,当您从 Observable 的声明式定义切换到命令式定义时,这会大大增加代码的出错几率。
一般来说,您应该尽可能使用 Observable 创建函数( of、from、create )。我想说大多数情况都可以在没有主题的情况下解决。不过,有一个陡峭的学习曲线,因为您必须了解大多数可观察的创建函数才能遵循该模式。
对于习惯于命令式编码(即使用像 JS 这样的脚本语言)的开发人员来说,Subject 可能会更自然,因为它有点类似于回调函数的简单包装对象。有人可能会问,如果不想要一个主题,为什么还要存在它呢?
根据这篇文章,主题只能在一种情况下使用:
强制且有状态地生成热可观察对象,无需任何直接的外部源。
简而言之,这意味着:当您没有任何外部源(例如 Observable、Promise 或 Event)并且需要从函数内部多播类的状态时,请使用主题。不过,您不应该将该主题暴露给其他人!
我建议你读一下这篇文章,它会让你明白一些事情。