2016-06-03 9 views
3

실제로 사용 사례는 상당히 일반적입니다. 많은 웹 서비스는 세션 시작시 검색하는 인증 토큰을 사용하며 이후 요청시이를 반환해야합니다.Play 2.5.x (스칼라) - wsClient를 통해 얻은 값을 (게으른) 값에 넣는 방법

은 내가 이런 식으로 작업을 수행 할 수 있습니다 알고 모든 문서는 우리가 기다리고 있습니다 결코 말처럼 잘못된 느낌

lazy val myData = {  
    val request = ws.url("/some/url").withAuth(user, password, WSAuthScheme.BASIC).withHeaders("Accept" -> "application/json") 
    Await.result(request.get().map{x => x.json }, 120.seconds) 
} 

합니다.

이것을 처리하는 Future/Promise 스칼라 스타일의 방법이 있습니까?

나는 var을 사용하지 않고 Promise의 완료시 코드를 실행할 수있는 .onComplete을 발견했습니다. 다른 범위의 lazy val에 해당 값을 가져올 방법이 없습니다. var이 있더라도 타이밍 문제가있을 수 있습니다. 따라서 가변 변수의 악조건이 있습니다.

다른 방법이 있습니까? lazy val의 동기식으로 그들이 (내부적 lazy val 간단한 synchronized 블록으로 표시된다) 값으로 완료 될 때까지 그들을 액세스하는 스레드를 차단하도록 설계 -

+0

당신의 목표 (PlayWS에 국한되지 않음)가'Future [T]'에서'T'를 얻는 것이라면,'lazy val'으로 선언해도 아무 것도 바뀌지 않습니다 :'Await' 알려진 단점이 있음), 그렇지 않을 수도 있습니다. – cchantep

+0

패턴은이 데이터를 한 번 수집하여 여러 번 사용합니다. 정확히 '게으른 val'이 의미하는 것입니다. 나는이 값을 받으면 필요한 부분을'.onComplete' 범위에 모아서 처리를 끝내기 위해 (내 머리부터) 여러 것을 뒤집어 쓰려고 노력하고있다. 무엇이 완료되어야하고 "어디에서"(행위자 내부에서) 수행되어야 하는지를 감안할 때 그 접근은 그 트릭을 할 수 있습니다. – Techmag

+0

당신은'게으른 val '로'Future [T]'를 가질 수 있지만, 정말로 유용하다는 것을 확신하지 못합니다. – cchantep

답변

0

불행히도,이 비 차단을 할 수있는 방법이 없다 .

Future/Promise 스칼라 방법은 수 Future[T] 또는 대신 val x: TPromise[T],하지만 방법은 발 각각의 사용에 executionContext들과 map의 오버 헤드의 큰 거래를 의미, 그리고 더 많은 최적의 자원 활용을 사용하는 것입니다 모든 경우에서 가독성이 떨어지는 가치는 없으므로 응용 프로그램의 여러 부분에서 광범위하게 값을 사용하면 Await을 그대로 두는 것이 좋습니다.

+1

downvoter는주의를 돌 립니까? –