Пока петля с фьючерсами в Scala - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть два метода:

def getNextJob: Future[Option[Job]]

def process(job: Job): Future[Unit]

Я хотел бы обрабатывать все задания, пока не осталось рабочих мест.

Я могу сделать это с помощью Await например

private def process()(implicit ctx: ExecutionContext): Future[Unit] = {
    var job: Option[Job] = Await.result(service.getNextJob, FiniteDuration(2, TimeUnit.SECONDS))
    while(job.isDefined) {
      Await.result(process(job.get), FiniteDuration(2, TimeUnit.SECONDS))
      job = Await.result(service.getNextJob, FiniteDuration(2, TimeUnit.SECONDS))
    }
    Future.successful()
  }

Но это ужасно и неправильно использует Futures.Есть ли способ, которым я мог бы каким-то образом связать фьючерсы, чтобы заменить это?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019
def processAll()(implicit ec: ExecutionContext): Future[Unit] =
  getNextJob.flatMap {
    case Some(job) => process(job).flatMap(_ => processAll())
    case None => Future.unit
  }
0 голосов
/ 11 февраля 2019
def go()(implicit ctx: ExecutionContext): Future[Unit] =
  getNextJob.flatMap { maybeJob ⇒
    if(maybeJob.isDefined) process(maybeJob.get).flatMap(_ ⇒ go())
    else Future.unit
  }

Примечание: Это не хвостовая рекурсия.

...