2017-04-06 86 views
0

我是Scala和Play Framework的新手,所以我不太清楚什么是错的。我正在尝试解压由Slick DB控制器(Play Framework)提供的Future [Option [MyType]]。 MyType在代码中称为BoundingBox:在Scala中解包未来[Option [MyType]]

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

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

我会欣赏这个问题的一些方向。

回答

2

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

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

// your code here 

Await.result(res, Duration.Inf) 

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

不应该在生产代码中使用Await,因为阻止操作会阻止代码在单独的线程中运行。

+0

非常感谢!这个伎俩 – Ivan

相关问题