当您无法控制发布者时,是否可以/建议使用响应式编程 简单的回答较长答案

问题描述

我对使用 ReactiveX 库进行响应式编程非常陌生,即便如此,我也已经开始欣赏其流畅的 API 和避免一类并发错误的编程风格。

因此,我想在工作中使用 ReactiveX(特别是 RxJava 和 RxJS),我正在开发一个应用程序,该应用程序基本上从服务器接收更新“流”并将其显示用户(经过一些操作)。在我看来,就反应流命名法而言,我的应用程序是一个订阅者”,它订阅发布者以接收感兴趣的值。

我有一些疑虑,这使我无法在工作中使用 RxJava:

  1. 在我的案例中,“发布者”是我无法控制或维护的另一项服务(不使用 RxJava 等),因此,我无法更改其代码来实现“发布者”接口。因此,我是否有可能(或者至少不是不习惯)使用 RxJava?如果是这样,我是否必须创建一个包装器来实现一个发布者,该发布者从其他服务中获取值并发出它?

  2. 订阅者和发布者是否有可能/共同实现不同的语言,例如订阅者(使用 RxJS 编写)订阅使用 RxJava 编写的发布者?

解决方法

简单的回答

不应该是一个问题。反应式编程是不是在网络的层面关注的数据格式或出版商。这是完全可能的只是功能的一小位是反应性,而完全不影响你的代码的其余部分。

JavaScript和Java既让你以最小的忙乱反应性和势在必行样式之间切换。

就像不要紧什么语言的服务器或客户端,只要他们可以读取和发送形成良好的信息运行。反应库通常是完全自包含的。

较长答案

从客户的角度来看,你的服务器是做可以在许多方面被抽象。什么是最简单/最好有很多更比服务器的网络库做。的角度的应用(例如)可使用角的HttpClient的治疗任何和所有网络流量作为流。不要紧,什么服务器是干什么的,也不是如何发送数据包。角可以把它们作为流。


即使它不是内置的,在现有的任何其他东西之上分层反应库应该相对容易。

受试者是构建块,让你的反应性/功能的样式和迫切的编程风格之间无缝地切换。

但是您目前能够获得的数据,则可以创建对象,并使用其.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)
  )
}