我想以一种我希望将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) {
^
也许这只是一件简单的事情,但我是新手。 如果有人能给出一个提示,那就太好了。
由于
答案 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}},然后您可以在Try
或Success
上进行匹配。