我在redis中存储令牌并使用redis non-blocking lib来获取它。该库为我正在使用的get api调用返回Future [Option [String]]。我无法弄清楚如何在保持异步的同时在流程中处理这个问题。如果我使用Await.result引入阻塞调用,我可以使它工作 -
object TokenFilter extends Filter {
def apply(nextFilter: (RequestHeader) => Future[SimpleResult])
(requestHeader: RequestHeader): Future[SimpleResult] = {
import scala.concurrent.ExecutionContext.Implicits.global
implicit val system = ActorSystem("redis-Client")
implicit val executionContext = system.dispatcher
implicit val timeout = AkkaTimeout(2 seconds)
val accesstoken: Future[Option[String]] = RedisClientFactory.getRedisClient().get("key11")
val result = Await.result(accesstoken, 2 second)
result match {
case Some(v) =>
Logger.info("success with value " + v)
nextFilter(requestHeader)
case None =>
Logger.info("failure with None ")
Future.successful(Results.Forbidden)
}
}
}
我似乎在这里遗漏了一些基本概念。任何指针将不胜感激。我需要调用nextFilter(requestHeader)获取成功,否则返回Results.Forbidden。
以下是我的一些未进行类型检查的尝试。
accesstoken map{ result =>
result match {
case Some(v) =>
Logger.info("success with value " + v)
nextFilter(requestHeader) //won't type check
case None =>
Logger.info("failure with None ")
Results.Forbidden
}
}
答案 0 :(得分:0)
回答我自己的问题,因为我从游戏线程中得到了答案,因为没有考虑它而让自己陷入困境。 flatMap就是答案。最简单的方法是使用map来转换容器中的内容。 flatMap将其从容器中取出。