【问题标题】:Play 2.2.1 -Making async call in Filter播放 2.2.1 - 在过滤器中进行异步调用
【发布时间】: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
          }
    }

【问题讨论】:

    标签: playframework scala-2.10


    【解决方案1】:

    回答我自己的问题,因为我从游戏线程中得到了答案,并且因为没有考虑它而打了自己的头。 flatMap 就是答案。最容易记住的方法是使用 map 来转换容器内的内容。 flatMap 将其从容器中取出。

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多