scala の並行パッケージには、ディレクティブでは Directive1 を返しますが、onComplete何も返さないメソッドがあります。akka-http
それが唯一の違いですか?私はときどき、この 2 つの方法で混乱しました。
これらのメソッドは目的が異なりますが、akka httpはリクエストのルーティングを完了するためにonCompletea の完了とともに機能することを意図しているという点で関連しています。Future
並行処理は、が完了したときに何らかの副作用を実行するためonCompleteのメソッドです。likeには他にも多くのメソッドがあり、一連の変換を経ると別のメソッドが生成されますが、何も返されず、その処理の「行き止まり」のようなものです。 FutureFutureFuturemapflatMapfilterFutureonCompleteFuture
onCompletewhile を使用して、 likemapを使用して を変更する方法を示す例は次のFutureとおりです。
val fut1 = Future{"1"} // A Future[String]
val fut2 = fut1.map(_.toInt) // Now a Future[Int]
fut2.onComplete{
case util.Success(i) => println(s"success: $i")
case util.Failure(ex) => ex.printStackTrace()
}
val badFut1 = Future{"A"}
val badFut2 = badFut.map(_.toInt) //Will be failed
badFut2.onComplete{
case util.Success(i) => println(s"success: $i")
case util.Failure(ex) => ex.printStackTrace()
}
最初のケースでは、「1」は Int にマッピングできるため、成功ケースにヒットします。2 番目の例では、"A" を Int にマップできないため、エラー ケースにヒットします。いずれにせよ、 のようなものmapを使用して新しい変換された未来を作成できる一方onCompleteで、 の最終結果に基づいて何かを行うために使用できることがわかりますFuture。
Akka Http では、Route非同期で何かを行う必要がある定義を作成する必要がある場合があります。その場合、その非同期タスクが完了したときにルートを完了する必要があります。ARoute自体はコンパイルするために完全に定義する必要があるため、何も返さず、その定義を不完全なものとしてレンダリングするため、既存のonCompleteon a を活用することはできません。したがって、Akka の担当者は、ルーティング ツリーにスナップして で動作するディレクティブを定義し、ツリーを完全に定義する を返します。例:FutureRouteonCompleteFutureDirectiveRouteFuture.onComplete
val myRoute =
get{
val fut = myActor ? "foo"
onComplete(foo){
case util.Success(_) => complete(StatusCodes.OK)
case util.Failure(ex) => complete(StatusCodes.InternalServerError)
}
}
ここで、Actor使用ask (?)者にリクエストを送信すると、返信がFuture返ってきます。私はまだ、Route定義している I'm を完成させる何かを作成する必要があります。私がこのようなことをした場合:
val myRoute =
get{
val fut = myActor ? "foo"
fut.onComplete{
case util.Success(_) => complete(StatusCodes.OK)
case util.Failure(ex) => complete(StatusCodes.InternalServerError)
}
}
hereonCompleteはディレクティブではなく からのものでFutureあり、それが返さUnitれ、 myRouteが完全に定義されず、コンパイルされないため、機能しません。
したがって、ディレクティブは、 a の完了に基づいてonCompletea を定義できるようにするためにありますが、これは、それ自体の既存のものでは適切に行うことができません。RouteFutureonCompleteFuture