scala の並行パッケージには、ディレクティブでは Directive1 を返しますが、onComplete
何も返さないメソッドがあります。akka-http
それが唯一の違いですか?私はときどき、この 2 つの方法で混乱しました。
これらのメソッドは目的が異なりますが、akka httpはリクエストのルーティングを完了するためにonComplete
a の完了とともに機能することを意図しているという点で関連しています。Future
並行処理は、が完了したときに何らかの副作用を実行するためonComplete
のメソッドです。likeには他にも多くのメソッドがあり、一連の変換を経ると別のメソッドが生成されますが、何も返されず、その処理の「行き止まり」のようなものです。 Future
Future
Future
map
flatMap
filter
Future
onComplete
Future
onComplete
while を使用して、 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
自体はコンパイルするために完全に定義する必要があるため、何も返さず、その定義を不完全なものとしてレンダリングするため、既存のonComplete
on a を活用することはできません。したがって、Akka の担当者は、ルーティング ツリーにスナップして で動作するディレクティブを定義し、ツリーを完全に定義する を返します。例:Future
Route
onComplete
Future
Directive
Route
Future.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 の完了に基づいてonComplete
a を定義できるようにするためにありますが、これは、それ自体の既存のものでは適切に行うことができません。Route
Future
onComplete
Future