2017-08-04 112 views
0

我下面这个教程中lagom执行流程 - https://www.lagomframework.com/documentation/1.3.x/scala/ServiceImplementation.html无法理解

我创建了一个记录的维修

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

我用记录如下:

override def hello3 = logged(ServerServiceCall 
    { (requestHeader,request) => 
    println("inside ssc") 
    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")) 
    } 
    }) 

我预计inside ssc将首先打印,然后打印在日志中,但它是相反的。不应该首先评估传递给函数的参数吗?

我明白了。为什么?

inside logged Received POST /hello3 inside ssc

回答

2

logged是,你写一个函数,一个ServiceCall,并有自己的ServiceCall装饰它。稍后,Lagom使用请求标头调用服务调用。您在服务调用已装饰的点上正在记录inside logged,然后它已被返回到Lagom,因此在调用之前,这就是为什么它首先被调用的原因。这也许可以解释它:

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只返回一个ServiceCall这Lagom将使用调用它。

+0

想要尝试代码,但它没有编译:( –

+0

仍然在编写代码,但有一些下面的问题(请原谅有限的scala知识) - 1.什么时候hello3被调用?2)Lagom执行打印但它创建actualServiceCall时不执行ServerServiceCall内的代码?为什么?此时仅创建ServerServiceCall的对象吗?当lagom使用其调用函数时,传递给该代码块的代码会被执行吗? 3)编写serviceCall时执行了创建serviceCall时传递给它的代码块吗? –

+0

啊!我的一些疑惑在第一段中解释 - https://www.lagomframework.com/documentation/1.3.x/scala/ServiceImplementation.html。仍然不能编译代码:( –