首页 > 解决方案 > 当您无法控制发布者时,是否可以/建议使用反应式编程

问题描述

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

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

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

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

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

标签: rxjsrx-javareactive-programmingreactive-streams

解决方案


简短的回答

应该不是问题。反应式编程不关心网络级别的数据格式或发布者。完全有可能只有一小部分功能是响应式的,而不会影响代码库的其余部分。

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)
  )
}

推荐阅读