scala - 将 Future[List[String]] 转换为 List[String]

标签 scala playframework-2.0

我有以下代码:

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/

相关文章:

scala - Play framework 2.0 - deadLetters 而不是 Actor

java - 使用 Play! 进行 Web 开发框架

java - 在 Play 2.3 Java 中使用 securesocial 保存用户数据

list - (Scala) 可以包含列表作为元素的列表

scala - 在函数参数级别实现 Ad hoc 多态性(混合不同类型的参数)

scala - 如何使用Scala IDE在Netbeans中设置Play Framework 2.0

java - 玩2.0不自动重新加载

scala - 创建一个映射来为 Spark Dataframe 的每一行调用 POJO

使用 apply 方法的泛型类型的 Scala 工厂?

scala - 如何以编程方式关闭 fs2.StreamApp?