我对使用ReactiveX库的反应式编程非常陌生,尽管如此,我已经开始欣赏它流畅的API和避免一类并发错误的编程风格。
因此,我想在工作中使用ReactiveX(特别是RxJava和RxJS(,我正在开发一个应用程序,该应用程序基本上接收";流";并将其显示给用户(经过一些操作(。在我看来,就反应流命名法而言,我的应用程序是";订户";订阅发布服务器以接收感兴趣的值。
不过,我有一些疑虑,这些疑虑使我无法在工作中使用RxJava:
-
;发布者";在我的情况下,是另一个我不控制或维护的服务(不使用RxJava等(,因此,我不能更改其代码来实现";发布者";界面因此,对我来说,使用RxJava是否可能(或者至少不是不习惯的(?如果是这样的话,我是否必须创建一个包装器来实现一个从其他服务获取值并发出它的发布服务器?
-
订阅服务器和发布服务器是否可以/常见地实现不同的语言,例如订阅服务器(使用RxJS编写(订阅使用RxJava编写的发布服务器?
简短答案
应该不是问题。反应式编程与网络层面的数据格式或发布者无关。完全有可能只让一小部分功能是被动的,而不会影响代码库的其余部分。
JavaScript和Java都允许您在反应式和命令式之间切换,而无需太多麻烦。
就像服务器或客户端运行什么语言并不重要,只要它们既能阅读又能发送格式良好的消息。反应式库通常是完全独立的。
较长的答案
从客户端的角度来看,服务器正在做的事情可以通过多种方式进行抽象。什么是最简单/最好的与网络库有关,而不是与服务器有关。angular应用程序(例如(可以使用angular的HttpClient将任何和所有网络流量视为流。不管服务器在做什么,也不管它如何发送数据包。Angular可以将它们作为流传递。
即使它不是内置的,也应该相对容易地在其他存在的库之上分层反应库。
主题是构建块,可以让你在反应式/函数式编程风格和命令式编程风格之间无缝切换。
无论您当前正在接收数据,都可以创建一个主题,并使用其.next
将数据传递到流中。
public payloadData: Subject;
function processData(payload){
this.payloadData.next(payload);
}
然后你就上路了。你可以从那里构建你的反应框架。
/***
* An observable, that (once subscribed) begins to keep a timestamped array of all
* values emitted by payloadData.
*
* TODO: Remove stale data and write it to disk.
***/
function accumulateDataHistory(): Observable {
return this.payloadData.pipe(
timestamp(),
scan((acc, curr) => ([...acc, curr]), []),
shareReplay(1)
)
}