我的EmployeesRepository
类中有一个函数,其签名如下:
def findAllEmployeesById(ids: List[String]): Array[RedisFuture[String]] {...}
我基本上是想将其传递给一个EmployeeREST
类,该类具有一个GET
(员工id)的List[String]
方法,并应返回一个JSON数组从Redis检索到的相应员工。
我可以通过Array[RedisFuture[String]]
吗?有什么办法可以让我真正地实现这一目标,还是我想错了方法?是否有其他方法可以实现我要在此处实现的功能?
答案 0 :(得分:2)
对问题进行一些评论:您可以先使用the converter将RedisFuture
转换为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)
}
}
}