2017-11-05 2 views
0

나는 경로 클래스 (보낸 사람), 배우 및 도우미 클래스가 있습니다. routes 클래스에서 배우에게 요청을 보내고 Future 응답을받습니다. 이제 저는 헬퍼에게 미래의 반응을 전달하고 거기서 해결하기를 원합니다.[Scala, Akka] : 미래 onComplete가 발신자 외부에서 실행되지 않습니다.

TestRoute.scala :

val response: Future[Any] = (actor ? request) (timeout) 
handler(response)(executionContext) 

TestHelper.scala :

def handler(futureResponse: Future[Any])(implicit ec: ExecutionContext): StandardRoute = { 
    onComplete(futureResponse) { 
    case Success(s) => complete(s) 
    case Failure(f) => reject 
    } 
} 

문제는 TestHelper.scala로 이동할 때 TestRoute.scala 내에서 onComplete 작품, 그것이 작동하지 않는 상태이다. 어떤 아이디어가 문제일까요?

는 편집 :하여 "그것이 작동하지 않습니다, 나는 전체의 onComplete 함수가 스킵 전혀 실행되지되지 않는다는 것을 의미합니다 - 그냥 건너 뛰고 오류를

몇 가지가 있습니다
+0

: 핸들러의 서명을 바꿀 것

type Output = ??? val response:() => Future[Output] = () => (actor ? request) (timeout) andThen (_.mapTo[Output]) 

: 난 당신이 뭔가를 할 생각? – Pedro

+0

귀하의 질문에 더 많은 맥락이 필요합니다. 내가 말할 수있는 것부터, 당신의 핸들러 함수는 새로운 Future [StandardRoute] 나 부작용을 리턴해야합니다. – zlace

+0

코드는 대략 나에게 괜찮은 것처럼 보입니다. 코드를 "건너 뛴다"고 말하면 어떻게 운동합니까? 대/소문자가 평가되지 않도록 인쇄/로그 문을 추가하려고 시도 했습니까? –

답변

0

."당신의 코드 기이은 " 그 문제를 설명 할 수 있습니다.

1.I 당신의 코드도 futureResponse 유형 Future[Any]이다 주어진 컴파일합니다 놀란다. You should use mapTo을 알려진 유형 TAny을 변환 할 수 있습니다. 당신은 코드가 구축 한 방법을 이제 의미 Any에 대한 마샬 러가있다. m TestRoute에서 사용할 수 있지만 TestHelper에서는 사용할 수 없습니다. responseval 아닌 def 것을

2. 사실은 Actor는 대신 요청에 따라 한 번에, 한 번에 조회 할 것을 의미합니다.

def handler(futureResponse:() => Future[Output])(implicit ec: ExecutionContext): StandardRoute = 
    onComplete(futureResponse()) { 
    case Success(s) => complete(s) 
    case Failure(f) => reject 
    } 
정확하게 "작동하지 않습니다"가 무슨 뜻 이죠
관련 문제