2017-04-06 82 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

相關問題