2016-04-04 8 views
1

Ich benutze PlayFramework und die Json-Bibliothek.Wie man mit Reads [Future [A]] umgehen kann

Ich habe einen ziemlich häufigen Anwendungsfall für die Deserialisierung: Ich muss das Vorhandensein einer ID in einem DB überprüfen.

Wer benutzt Reads[Future[T]] oder ist es eine schlechte Idee?

Scheint ich Future[JsResult[T]] in JsResult[Future[T]] konvertieren müssen mit den bestehenden combinator zu spielen ...

Beispiel für Code, was ich will

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

Wissen Sie, ob es Beispielcode ist diese Art von Tricks zu tun?

+0

Sind Sie sicher, dass Sie JSON deserializing mit Datenbanküberprüfung wie folgt koppeln möchten? Wäre es nicht einfacher zu testen und zu begründen (d. H. Separate Stufen und/oder Fehlermeldungen), wenn Sie Ihr JSON zuerst an ein Objekt deserialisiert haben, * dann * überprüft, ob es gefunden werden kann? – millhouse

Antwort

1

Nicht sicher, ob ich Ihre Frage richtig verstanden habe, aber es ist in Ordnung, mit Futures im Spiel zu arbeiten.

Sie können Ihre Aktion als Action.async definieren, und jetzt erwartet sie Future[Result]. Sie können Ihre Zukunft in ein richtiges Ergebnis mappen lassen und diese Zukunft zurückgeben.

Beispiel:

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

Die Art JsResult[Future[T]] seltsam klingt. Wenn Sie eine Operation haben, die JsResult produziert, würden Sie erwarten, dass es async ist, wenn Sie bereits mit Futures arbeiten

Verwandte Themen