具有反应性副作用的反应性物流

时间:2018-10-17 10:53:29

标签: reactive-programming rx-java2 project-reactor

我认为大多数反应式实现都可以类似地完成此操作,因此在此不指定任何特定的库和语言。

对流产生反应性副作用的正确方法是什么(不确定此处使用的正确术语是什么)?

因此,可以说我们有Player个流。我们希望将其转换为仅id个流。但是除此之外,我们还要根据ID进行其他一些反应式处理。

这是一种不那么优雅的方式,但是实现这一目标的惯用方式是什么:

Observable<Player> playerStream = getPlayerStream();
return playerStream
      .map(p -> p.id)
      .flatmap(id -> {
           Observable<Result> weDontCare = process(id);
           // Now the hacky part
           return weDontCare.map(__ -> id);
      })

可以吗?似乎不太优雅。

2 个答案:

答案 0 :(得分:0)

我不了解RxJava,但是您也可以获取项目反应器标签,根据您希望副作用如何影响流,有两种方法可以对反应器进行此操作。如果您想等待副作用发生,以便可以处理错误等(我的首选方式),请使用delayUntil:

return getPlayerStream()
  .map(p -> p.id)
  .delayUntil(id -> process(id));

如果您希望ID无需等待就直接通过,而是执行即弃型样式的副作用,则可以使用doOnNext:

return getPlayerStream()
  .map(p -> p.id)
  .doOnNext(id -> process(id).subscribe());

答案 1 :(得分:-1)

Observable<Player> playerStream = getPlayerStream();
    return playerStream
          .map(p -> p.id)
          .doOnEach(id -> { //side effect with id
            Observable<Result> weDontCare = process(id);
            weDontCare.map(__ -> id);
          })