在可观察的消耗完成之前,如何阻止程序终止?

时间:2020-08-10 16:32:11

标签: scala monix

我目前正在尝试使用Monix限制api get请求。我已经尝试过使用STTP的Monix后端,并且工作正常,直到完成后无法关闭Monix后端为止。因为这似乎比Monix更像是一个sttp问题,所以我尝试通过以下方式重新解决该问题:使用sttp的默认后端,同时仍然使用Monix进行限制。

一旦我消耗了可观察的东西,我主要是在关闭monix后端上苦苦挣扎

我试图通过以下方法简化问题:

  import monix.execution.Scheduler.Implicits.global

  val someIter = List(Task(1), Task(2))

  val obs: Observable[CancelableFuture[Int]] = Observable
    .fromIterable(someIter)
    .throttle(3.second, 1)
    .map(_.runToFuture)

但是,我仍然不确定在使用Observable之后如何关闭程序,因为它在这里过早终止(与monix后端的情况不同)...

换句话说,如何在Observable Iterable完成之前阻止终止程序?

2 个答案:

答案 0 :(得分:3)

您可以创建Promise,并在Observable完成.doOnComplete时完成它

并在主线程中等待它。

import monix.execution.Scheduler.Implicits.global

val someIter = List(Task(1), Task(2))
val promise = Promise()
val obs: Observable[CancelableFuture[Int]] = Observable.fromIterable(someIter).throttle(3.second, 1)
  .map(_.runToFuture)
  .doOnComplete(Task { promise.complete(Success()) })

Await.ready(promise.future, Duration.Inf)

答案 1 :(得分:1)

除了Artem接受的答案以及Monix Gitter community的见解之外,另一种可能的实现方式可能是:

  val someIter = List(Task(1), Task(2))
  val obs =
    Observable
      .fromIterable(someIter)
      .throttle(1 second, 10)
      .mapParallelUnordered(10)(x => x.map(x => x.send().body)) // Here we send requests
      .sumL // Sum just as an example 
      .runSyncUnsafe()
相关问题