1

我想以一种我想将 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) {
                 ^

也许这只是一件简单的事情,但我是新手。因此,如果有人可以提供提示,那就太好了。

谢谢

4

1 回答 1

0

onSuccess接受一个函数,基本上当你在未来使用它时,未来内部的值变得可用,如果你愿意,你可以使用该值完成你的路线:

case class ResponseData(data: String)

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

从评论:

“展开” aFuture[T]并在未来完成后运行其内部路线,并将未来的值作为 type 的提取T

另请注意

如果 future 失败,它的失败 throwable 会冒泡到最近的 ExceptionHandler。

也许你想使用onCompletewhich 返回 aTry然后你可以匹配Successor Failure

于 2015-09-09T08:21:25.310 回答