【发布时间】:2014-01-30 02:07:22
【问题描述】:
我在 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
}
}
【问题讨论】: