我有以下代码:
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执行另一个请求以获取权限是否更好?我不这么认为。
最佳答案
future 的一般信息
您将在 Futures 上找到您需要的所有信息 http://docs.scala-lang.org/overviews/core/futures.html .
一种可能的方法是等待结果,但在 prod 应用程序中使用并不好。
val myFutureResult : Future[T] = Future {...}
val myResult : T = Await.result(myFutureResult, secondsToWait seconds)
通常,您可以映射
future 并组合它,而不是等待结果并将其存储在变量中,并且仅在最后一刻使用 Await。
val myFutureResult : Future[T] = Future {...}
def myFunctionOnT(in: T) = ...
for {res <- myFutureResult } yield myFunctionOnT(res)
游戏和 future
Play 本身可以默认使用 Action.async {}
而不是 Action{}
来处理 Future[T]
你可以在这里找到更多: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)
}
关于scala - 将 Future[List[String]] 转换为 List[String],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34089193/