在Scala中解压缩Future [Option [MyType]]

时间:2017-04-06 23:15:06

标签: scala playframework slick

我是Scala和Play Framework的新手,所以我不太确定是什么问题。我正在尝试解压由Slick DB控制器(Play Framework)给出的Future [Option [MyType]]。 MyType在代码中称为BoundingBox:

  def getBoundingBoxByFileName(name: String) = {
    val selectByName = boundingBoxTableQuery.filter{ boundingBoxTable =>
      boundingBoxTable.name === name
    }
    db.run(selectByName.result.headOption)
  }

BoundingBox类型有一个名为product_name的字段。要检索此字段,请执行以下操作:

  val boundingBoxFutOpt = BoundingBoxQueryActions.getBoundingBoxByFileName("some_file")

  val res = for {
    optBb : Option[db.BoundingBox] <- boundingBoxFutOpt
  } yield{
    for(bb : db.BoundingBox <- optBb) yield {
      println(s"${bb.product_name}")
    }
  }

此代码在输出上不产生任何内容,但我没有编译错误。如果我更改某些随机文本的println语句(不使用bb引用),它也不会在控制台上打印。对我而言,似乎永远不会执行println语句。

我会对这个问题有所了解。

1 个答案:

答案 0 :(得分:2)

在未来有机会运行println之前,您的程序可能会终止。我想这会得到你想要的东西:

import scala.concurrent.Await
import scala.concurrent.duration.Duration

// your code here

Await.result(res, Duration.Inf)

在上面的示例中,您正在运行一个线程但是没有给它机会完成执行。以上将阻止,直到将来完成。

你不应该在生产代码中使用Await,因为阻塞完成否定了在单独的线程中运行代码的价值。