2014-01-30 2 views
0

토큰을 redis에 저장하고 redis non-blocking lib을 사용하여 가져옵니다. 이 라이브러리는 내가 사용하고있는 get api 호출에 대한 Future [Option [String]]을 반환합니다. 비동기로 유지하면서 흐름에서이를 처리하는 방법을 알 수 없습니다.재생 2.2.1 - 필터에서 비동기 호출 만들기

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)   
    } 

    }  
} 

나는 여기에 몇 가지 기본 개념을 누락하는 것 - 내가 차단 호출과 같이 Await.result 사용하여 소개하면 나는 그것을 작업을 얻을 수 있습니다. 모든 포인터는 크게 감사하겠습니다. 성공을 위해 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

놀이터에서 대답을 얻었을 때 자신의 질문에 대답하고 그것에 대해 생각하지 않은 채로 머리를 쓰고 있습니다. flatMap이 답입니다. 기억하는 가장 쉬운 방법은 맵을 사용하여 컨테이너 내의 내용을 변환하는 것입니다. flatMap 컨테이너에서 꺼내십시오.