我是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语句。
我会对这个问题有所了解。
答案 0 :(得分:2)
在未来有机会运行println之前,您的程序可能会终止。我想这会得到你想要的东西:
import scala.concurrent.Await
import scala.concurrent.duration.Duration
// your code here
Await.result(res, Duration.Inf)
在上面的示例中,您正在运行一个线程但是没有给它机会完成执行。以上将阻止,直到将来完成。
你不应该在生产代码中使用Await,因为阻塞完成否定了在单独的线程中运行代码的价值。