将Future [List [String]]转换为List [String] [英] Convert Future[List[String]] to List[String]

查看:406
本文介绍了将Future [List [String]]转换为List [String]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList))

,我收到以下错误消息:

and I get the following error:

[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的新手.

So I suppose I have to convert the Future[List[String]] to List[String]. I am new to scala sorry if that's too easy.

完整代码:

  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)
  }
}

我只想获取用户,然后填写所有权限.个人权限和由分配给用户的角色继承的权限.

I just want to get the user and then fill all permissions. Individual permissions and permissions inherited by the role assigned to the user.

获取用户,然后执行另一个请求以根据用户ID获得权限是否更好?我不这么认为.

Is it better to get the user and then perform another request to get the permissions based on the user id? I don't think so.

推荐答案

关于期货的一般信息

您将在以下位置找到所需的所有关于期货的信息. http://docs.scala-lang.org/overviews/core/futures.html .

一种可能的方法正在等待结果,但是在产品应用程序中使用它不是很好.

A possible approach is awaiting the result, but it is not good to use in a prod application.

val myFutureResult : Future[T] = Future {...}
val myResult : T = Await.result(myFutureResult, secondsToWait seconds)

通常,不必等待结果并将其存储在变量中,您可以map将来进行组合,并且仅在最后一刻使用Await.

Normally instead of awaiting the result and storing it in a variable you can map the future and compose it and only use Await at the last moment.

val myFutureResult : Future[T] = Future {...}
def myFunctionOnT(in: T) = ...

for {res <- myFutureResult } yield myFunctionOnT(res)

游戏和期货

默认情况下,播放器本身可以使用Action.async {}而不是Action{}来处理Future[T],在这里您可以找到更多信息:

Play and Futures

Play itself can handle Future[T]by default by using Action.async {} instead of Action{} here you can find more: 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)
  }

这篇关于将Future [List [String]]转换为List [String]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆