Spray:考虑onSuccess指令

时间:2015-09-09 07:14:18

标签: scala spray spray-json spray-dsl

我想以一种我希望将onSuccess块分解为新方法的方式更改以下代码片段。 JSON编组应该仍然有效。

(patch & parameterMap & asJson) { params =>
   ...
   val f:Future[ResposeData]=createResponse(...)
   onSuccess(f){complete(_)}
}

我希望有一个方法:

def handleSuccess(f:Future/FutureMagnet)(implicit ...)

简单的重构对我不起作用。我尝试了很多组合,但我找不到正确的签名或代码工作。

示例:

def handleSuccess(f: Future[ResposeData]): Unit = {
    onSuccess(f) { complete(_) }
}

Error:(43, 15) type mismatch;
 found   : scala.concurrent.Future[ResponseData]
 required: spray.routing.directives.OnSuccessFutureMagnet
    onSuccess(f) {
          ^

如果我现在更改签名,我会收到另一个错误:

def handleSuccess(f: OnSuccessFutureMagnet)

Error:(44, 18) spray.routing.Directive[f.Out] does not take parameters
    onSuccess(f) {
                 ^

也许这只是一件简单的事情,但我是新手。 如果有人能给出一个提示,那就太好了。

由于

1 个答案:

答案 0 :(得分:0)

onSuccess需要一个函数,基本上当你在未来使用它时,未来的值变得可用,你可以根据需要使用该值完成你的路线:

case class ResponseData(data: String)

def handleSuccess(f: Future[ResponseData]): Unit = {
  onSuccess(f) { responseData =>
    complete(_)
  }
}

来自评论:

  

"解开" a Future[T]并在未来完成后运行其内部路由,将未来的值作为T类型的提取。

另请注意

  

如果未来失败,它的失败就会冒泡到最近的ExceptionHandler。

也许您想使用返回onComplete的{​​{1}},然后您可以在TrySuccess上进行匹配。