播放2.2.1 - 在Filter中进行异步调用

时间:2014-01-30 02:07:23

标签: playframework scala-2.10

我在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
          }
    }

1 个答案:

答案 0 :(得分:0)

回答我自己的问题,因为我从游戏线程中得到了答案,因为没有考虑它而让自己陷入困境。 flatMap就是答案。最简单的方法是使用map来转换容器中的内容。 flatMap将其从容器中取出。