我正在开发一个代码库,调用我的Spray API需要同步调用一个返回Try Spray需要格式化并通过HTTP返回的服务。
我最初的尝试看起来像这样:
// Assume myService has a run method that returns a Try[Unit]
lazy val myService = new Service()
val routes =
path("api") {
get {
tryToComplete {
myService.run()
}
}
} ~
path("api" / LongNumber) { (num: Long) =>
get {
tryToComplete {
myService.run(num)
}
}
}
def tryToComplete(result: => Try[Unit]): routing.Route = result match {
case Failure(t) => complete(StatusCodes.BadRequest, t.getMessage)
case Success(_) => complete("success")
}
然而,这导致在应用程序启动时调用myService.run()
。我不知道为什么这个方法被调用,因为没有进行HTTP调用。
所以我有两个问题:
答案 0 :(得分:0)
即使您将结果参数作为名称调用,它也会立即进行评估
result match {
为了不进行评估,它必须在完整的范围内,即你的代码应该看起来像(没有试图编译它):
def tryToComplete(result: => Try[Unit]): routing.Route = complete {
result match {
case Failure(t) => StatusCodes.BadRequest, t.getMessage
case Success(_) => "success"
}
}
答案 1 :(得分:0)
我解决这个问题的方法是做以下事情:
article