我了解了制作 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()
方法,观察者方法位于我们传递给可观察对象的函数中。
除了行为上的差异之外,用Subject创建的observable和用Observable创建的observable之间还有其他区别吗?
A Subject
既是Observable
and Observer
同时。这使得它很容易使用,因为你得到了对Observer
您可以在代码中传递并从您想要的任何地方发出项目。然而,当您从 Observable 的声明式定义切换到命令式定义时,这会大大增加代码的错误倾向。
一般来说,你应该使用 Observable 创建函数(of https://www.learnrxjs.io/operators/creation/of.html, from https://www.learnrxjs.io/operators/creation/from.html, create https://www.learnrxjs.io/operators/creation/create.html)只要有可能。我想说大多数情况都可以在没有主题的情况下解决。不过,有一个陡峭的学习曲线,因为您必须了解大多数可观察的创建函数才能遵循该模式。
对于习惯于命令式编码(即使用像 JS 这样的脚本语言)的开发人员来说,Subject 可能会更自然,因为它有点类似于回调函数的简单包装对象。有人可能会问,如果不合需要,为什么还要有一个主题。
根据这个article http://davesexton.com/blog/post/To-Use-Subject-Or-Not-To-Use-Subject.aspx, 主题仅在一种情况下使用:
强制且有状态地生成热可观察对象,无需任何直接的外部源。
简而言之,这意味着:当您没有任何外部源(例如 Observable、Promise 或 Event)并且需要从函数内部多播类的状态时,请使用主题。不过,您不应该将该主题暴露给其他人!
我建议你读一下这篇文章,它会让你明白一些事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)