我有以下代码:
Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList))
我收到以下错误:
[error] found : scala.concurrent.Future[List[String]] [error] required: List[String] [error] Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList)), [error] ^ [error] one error found
所以我想我必须转换Future[List[String]]
为List[String]
.我是scala的新手,如果这太容易了,那就很抱歉.
完整代码:
def find(loginInfo: LoginInfo): Future[Option[models.admin.User]] = { val userQuery = for { dbLoginInfo <- loginInfoQuery(loginInfo) dbUserLoginInfo <- Userlogininfo.filter(_.logininfoid === dbLoginInfo.id) dbUser <- User.filter(_.userid === dbUserLoginInfo.userid) } yield dbUser db.run(userQuery.result.headOption).map { dbUserOption => dbUserOption.map { user => val permissionQuery = for { dbUserPermission <- Userpermission.filter(_.userid === user.userid) dbPermission <- Permission.filter(_.id === dbUserPermission.permissionid) } yield dbPermission val rolePermissionQuery = for { dbUserRole <- Userrole.filter(_.userid === user.userid) dbRole <- Role.filter(_.id === dbUserRole.roleid) dbRolePermission <- Rolepermission.filter(_.roleid === dbRole.id) dbPermission <- Permission.filter(_.id === dbRolePermission.permissionid) } yield dbPermission val unionPermissionQuery = permissionQuery union rolePermissionQuery models.admin.User( UUID.fromString(user.userid), user.firstname, user.lastname, user.jobtitle, loginInfo, user.email, user.emailconfirmed, Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList)), user.enabled) } }
我只想获得用户,然后填写所有权限.分配给用户的角色继承的个人权限和权限.
获取用户然后执行另一个请求以获取基于用户ID的权限更好吗?我不这么认为.
您可以在 http://docs.scala-lang.org/overviews/core/futures.html上找到所需的所有期货信息.
可能的方法是等待结果,但在prod应用程序中使用并不好.
val myFutureResult : Future[T] = Future {...} val myResult : T = Await.result(myFutureResult, secondsToWait seconds)
通常情况下,不是等待结果并将其存储在变量中,您可以map
将来组成它并且仅在最后时刻使用Await.
val myFutureResult : Future[T] = Future {...} def myFunctionOnT(in: T) = ... for {res <- myFutureResult } yield myFunctionOnT(res)游戏和期货
播放本身可以Future[T]
默认使用Action.async {}
而不是在Action{}
这里你可以找到更多:https://www.playframework.com/documentation/2.5.x/ScalaAsync
db.run(unionPermissionQuery.result).map(_.map(_.name).toList).map { permission => models.admin.User( UUID.fromString(user.userid), user.firstname, user.lastname, user.jobtitle, loginInfo, user.email, user.emailconfirmed, Some(permission), user.enabled) }