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(_)
  }
}

コメントから:

a を「アンラップ」Future[T]し、将来の完了後にその内部ルートを実行し、将来の値を type の抽出として使用しTます。

また、

future が失敗した場合、その失敗のスロー可能オブジェクトは最も近い ExceptionHandler にバブルアップされます。

onCompletewhich を返すと、 orTryに一致させることができます。SuccessFailure

于 2015-09-09T08:21:25.310 に答える