2016-04-04 75 views
1

我正在使用PlayFramework和json庫。如何處理讀取[未來[A]]

我有一個非常常見的用於反序列化的用例:我需要檢查DB中是否存在一個id。

任何人使用Reads[Future[T]]或者這是一個壞主意?

看來我需要Future[JsResult[T]]轉換成JsResult[Future[T]]與現有的組合子玩...代碼

的例子,我想

def existenceReads[A](otherwise : ValidationError)(f: String => Future[Option[A]]) : Reads[Future[A]] = 
    Reads[Future[A]](js => StringReads.reads(js).flatMap { 
    v => f(v).map(_.fold(JsError(otherwise))(a => JsSuccess(a))) 
    }) 

你知道,如果有代碼做那種技巧的樣本?

+0

你確定要結合JSON反序列化和數據庫檢查嗎?如果你首先將你的JSON反序列化爲一個對象,那麼測試和推理(即單獨的階段和/或錯誤消息)會不會更容易,然後*檢查是否可以找到它? – millhouse

回答

1

不確定我是否正確理解你的問題,但可以在期貨中工作。

您可以將您的操作定義爲Action.async,現在它預計爲Future[Result]。你可以將你的未來映射到正確的結果並返回這樣的未來。

實施例:

def checkId = Action.async { 
val jsResult = existenceReads(...) 
jsResult map { 
    case JsError(error) => BadRequest 
    case JsSuccess(val) => Ok 
} 
} 

類型JsResult[Future[T]]聽起來怪異。如果你有一些操作產生JsResult,你會期望它是異步的,如果你已經與期貨合作