如何将RedisFutures数组传递给Akka HTTP onSuccess方法?

时间:2018-07-11 04:38:39

标签: scala redis akka-http

我的EmployeesRepository类中有一个函数,其签名如下:

def findAllEmployeesById(ids: List[String]): Array[RedisFuture[String]] {...}

我基本上是想将其传递给一个EmployeeREST类,该类具有一个GET(员工id)的List[String]方法,并应返回一个JSON数组从Redis检索到的相应员工。

我可以通过Array[RedisFuture[String]]吗?有什么办法可以让我真正地实现这一目标,还是我想错了方法?是否有其他方法可以实现我要在此处实现的功能?

1 个答案:

答案 0 :(得分:2)

对问题进行一些评论:您可以先使用the converterRedisFuture转换为scala Future

import scala.compat.java8.FutureConverters.toScala

val redisFutureToScalaFuture : RedisFuture[String] => Future[String] = toScala

这可用于转换整个RedisFuture Array

val redisArrayToScala : Array[RedisFuture[String]] => Array[Future[String]] = 
  _ map redisFutureToScalaFuture

现在,Future.sequence函数将很容易在数组内部展开期货:

val unwrapArray : Array[Future[String]] => Future[Array[String]] = Future.sequence 

将所有这些与原始查询功能结合在一起:

val idsToFuture : List[String] => Future[Array[String]] = 
  (findAllEmployeesById _) andThen redisArrayToScala andThen unwrapArray

最后,idsToFuture可以在Directive中使用:

val entityToList : RequestEntity => List[String] = ???

val arrayToResponse : Array[String] => String = ???

val route : Route = 
  get {
    extractRequestEntity { entity =>
      onComplete(idsToFuture(entityToList(entity))) {
        case Success(arr) => complete(200 -> arrayToResponse(arr))
        case Failure(ex)  => complete(500 -> ex.toString)
      }
    }
  }