2016-04-04 2 views
1

Я использую PlayFramework и json lib.Как работать с Reads [Future [A]]

У меня довольно распространенный вариант использования для десериализации: мне нужно проверить наличие идентификатора в БД.

Кто-нибудь пользуется 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, вы ожидаете, что она будет асинхронной, если вы уже работаете с фьючерсами.

Смежные вопросы