2017-08-04 6 views
0

に実行フローを理解することができませんでしhttps://www.lagomframework.com/documentation/1.3.x/scala/ServiceImplementation.html私はこのチュートリアルで、次のいlagom

を私は次のようにログインして使用ログに記録されたサービス

//logged takes a ServerServiceCall as argument (serviceCall) and returns a ServerServiceCall. 
    //ServerServiceCall's compose method creates (composes) another ServerServiceCall 
    //we are returing the same ServerServiceCall that we received but are logging it using println 
    def logged[Request,Response](serviceCall:ServerServiceCall[Request,Response]) = { 
    println("inside logged"); 

    //return new ServerServiceCall after logging request method and uri 
    ServerServiceCall.compose({ 
    requestHeader=>println(s"Received ${requestHeader.method} ${requestHeader.uri}") 
    serviceCall 
    } 
)} 

を作成しました最初に印刷されてから記録されますが、それは逆でした。関数に渡された引数が最初に評価されるべきではありませんか?

私はこれを手に入れました。どうして?

inside logged Received POST /hello3 inside ssc

答えて

2

loggedServiceCallを取り、独自のServiceCallでそれを飾るあなたが書いた関数です。その後、Lagomは要求ヘッダーでサービスコールを呼び出します。サービスコールが装飾されてからLagomに返される前に、inside loggedを記録しているので、呼び出される前にまず呼び出されます。これは、それを説明することがあります

def logged[Request, Response](serviceCall:ServerServiceCall[Request, Response]) = { 
    println("3. inside logged method, composing the service call") 
    val composed = ServerServiceCall.compose { requestHeader=> 
    println("6. now Lagom has invoked the logged service call, returning the actual service call that is wrapped") 
    serviceCall 
    } 

    println("4. Returning the composed service call") 
    composed 
} 

override def hello3 = { 
    println("1. create the service call") 
    val actualServiceCall: ServerServiceCall[Request, Response] = ServerServiceCall { (requestHeader, request) => 
    println("7. and now the actual service call has been invoked") 
    val incoming:Option[String] = requestHeader.getHeader("user"); 

    val responseHeader = ResponseHeader.Ok.withHeader("status","authenticated") 
    incoming match { 
     case Some(s) => Future.successful((responseHeader,("hello3 found "+s))) 
     case None => Future.successful((responseHeader,"hello3 didn't find user")) 
    } 
    } 

    println("2. wrap it in the logged service call") 
    val loggedServiceCall = logged(actualServiceCall) 

    println("5. return the composed service call to Lagom") 
    loggedServiceCall 
} 

覚えておくべき重要なことは、hello3メソッドの呼び出しがhello3は単にLagomはそれを呼び出すために使用しますServiceCallを返し、サービスコールのない呼び出しであるということです。

+0

コードを試したいと思っていましたが、コンパイルできませんでした。( –

+0

まだコードをコンプリートしていますが、いくつかの質問が残っています(scalaの知識が限られています) - 1. hello3が呼び出されるのはいつですか? actualServiceCallを作成するときに、ServerServiceCall内のコードを実行しませんか?どうして?この時点でServerServiceCallのオブジェクトのみが作成されますか?ブロックに渡されたコードは、lagomがその呼び出し関数を使用するときに実行されますか? 3)serviceCallが作成されたときにserviceCallが渡されたコードのブロックを実行しましたか? –

+0

ああ!私の疑問の一部は、ここでは最初のパラ自体 - https://www.lagomframework.com/documentation/1.3.x/scala/ServiceImplementation.htmlで説明されています。しかし、コードをコンパイルすることはできません。( –

関連する問題