在Akka Streams可观察到延迟

时间:2017-06-11 12:53:30

标签: akka rx-java observable akka-stream reactivex

我来自ReactiveX,我们有运营商 defer ,以便创建Observable并在我们有订阅者后获得排放值。

在Akka Streams中,我想知道是否存在类似的东西:

 @Test def defer(): Unit = {
    var range = 0 to 10
    val graphs = Source(range)
      .to(Sink.foreach(println))
    range = 10 to 20
    graphs.run()
    Thread.sleep(2000)
  }

拥有此代码,甚至在我们执行run()之前,更改范围的值,由于蓝图已经创建,因此值不会更改,并且会发出0到10。

在Akka Streams中有类似Observable.defer的内容吗?

我找到了解决方案,解决方案是使用 lazy 关键字,我们提供了一个在运行流后执行的功能。

我会保留这个问题,以防万一有更好的方法或其他人有同样的问题

  @Test def defer(): Unit = {
    var range = 0 to 10
    val graphs = Source.lazily(() => Source(range))
      .to(Sink.foreach(println))
    range = 10 to 20
    graphs.run()
    Thread.sleep(2000)
  }

问候。

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是Source.fromIterator(() => List(1).iterator)或类似的东西。在Akka Streams API中,我们选择尝试保留最小的操作符集,因此有时您可能会遇到单行中可以实现相同的情况,但是不会像在延迟的情况下那样直接使用名称。如果您认为这是一个很常见的事情,请通过github.com/akka/akka告诉我们,我们可以考虑将其添加为API。

请注意,还有fromFuture和其他版本,根据您的实际使用情况(特别是与Promise结合使用时),虽然没有直接相关可能会有用。