While循环与Scala中的期货

时间:2019-02-11 16:03:26

标签: scala future

我有两种方法:

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

但这很丑陋,不能正确使用期货。我有办法以某种方式替换期货吗?

2 个答案:

答案 0 :(得分:3)

def go()(implicit ctx: ExecutionContext): Future[Unit] =
  getNextJob.flatMap { maybeJob ⇒
    if(maybeJob.isDefined) process(maybeJob.get).flatMap(_ ⇒ go())
    else Future.unit
  }

注意:它不是尾递归。

答案 1 :(得分:1)

def processAll()(implicit ec: ExecutionContext): Future[Unit] =
  getNextJob.flatMap {
    case Some(job) => process(job).flatMap(_ => processAll())
    case None => Future.unit
  }