在Scala中解包Future[选项[MyType]]

在Scala中解包Future[选项[MyType]],scala,playframework,slick,Scala,Playframework,Slick,我是Scala和Play框架的新手,所以我不太确定到底出了什么问题。我正在尝试解包一个由一个狡猾的DB控制器(Play Framework)提供的未来[选项[MyType]]。MyType在代码中称为BoundingBox: def getBoundingBoxByFileName(name: String) = { val selectByName = boundingBoxTableQuery.filter{ boundingBoxTable => boundi

我是Scala和Play框架的新手,所以我不太确定到底出了什么问题。我正在尝试解包一个由一个狡猾的DB控制器(Play Framework)提供的未来[选项[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}")
    }
  }
val boundingBoxFutOpt=BoundingBoxQueryActions.getBoundingBoxByFileName(“一些文件”)
val res=用于{

optBb:Option[db.BoundingBox]您的程序很可能在将来有机会运行println之前终止。我认为这将满足您的需要:

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

// your code here

Await.result(res, Duration.Inf)
在上面的示例中,您正在运行一个线程,但没有给它一个完成执行的机会。上述操作将被阻止,直到将来完成


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

您的程序很可能在将来有机会运行println之前终止。我认为这将满足您的需要:

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

// your code here

Await.result(res, Duration.Inf)
在上面的示例中,您正在运行一个线程,但没有给它一个完成执行的机会。上述操作将被阻止,直到将来完成

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