Я делаю настоящий толчок, чтобы понять асинхронные возможности игры, но обнаруживаю много конфликтов в отношении мест, где подходит асинхронный вызов, и места, где структура, похоже, замышляет против ее использования.
Пример, который я имею в отношении проверки формы. Play позволяет определять специальные ограничения - см. Это в документах:
val loginForm = Form(
tuple(
"email" -> email,
"password" -> text
) verifying("Invalid user name or password", fields => fields match {
case (e, p) => User.authenticate(e,p).isDefined
})
)
Приятный и чистый. Тем не менее, если я использую полностью асинхронный доступ к данным (например, ReactiveMongo), такой вызов User.authenticate(...)
вернет Future
, и я, таким образом, буду в темноте относительно того, как я могу использовать мощность как встроенные функции привязки формы и асинхронные инструменты.
Хорошо и хорошо публиковать асинхронный подход, но я расстраиваюсь, что некоторые части фреймворка не так хорошо играют с ним. Если валидация должна выполняться синхронно, она, похоже, лишает точку асинхронного подхода. Я столкнулся с подобной проблемой при использовании композиции Action
- например, связанный с безопасностью Action
, который сделал бы вызов ReactiveMongo.
Может ли кто-нибудь пролить свет на то, где мое понимание не ослабевает?