在scala并发包中,onComplete
方法在akka-http
指令中没有返回任何内容,它返回Directive1。
这是唯一的区别吗?我有时对这两种方法感到困惑。
答案 0 :(得分:1)
这些方法的目的不同,但它们的相关之处在于,akka http Future
旨在完成onComplete
以完成路由请求。
并发Future
是Future
上的一种方法,用于在Future
完成后执行某种副作用。 map
上有很多其他方法,例如flatMap
,filter
和Future
,当您进行一系列转换时会生成另一个onComplete
,但是Future
没有返回任何东西,而且是一个死胡同"在处理onComplete
时。
使用map
同时还显示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()
}
的示例如下:
map
在第一种情况下,我们将成功案例为" 1"可以映射到Int。在第二个例子中,我们将在#34; A"无法映射到Int。无论哪种方式,您都可以看到onComplete
之类的内容可用于创建新的转型后期,而Future
可用于根据Route
的最终结果执行某些操作。
在Akka Http中,您有时需要创建需要异步执行某些操作的Route
定义。在这种情况下,您需要在异步任务完成时完成路由。 onComplete
本身需要完全定义才能进行编译,因此您无法利用Future
上的现有Route
,因为它不会返回任何内容,而是会呈现那onComplete
不完整。因此,Akka的人员定义了一个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
。我仍然需要制作完成我定义的val myRoute =
get{
val fut = myActor ? "foo"
fut.onComplete{
case util.Success(_) => complete(StatusCodes.OK)
case util.Failure(ex) => complete(StatusCodes.InternalServerError)
}
}
的东西。如果我做了这样的事情:
onComplete
它已经过时了,因为Future
来自Unit
而不是指令,而且返回Route
而我的onComplete
赢了&# 39;完全定义并且不会编译。
因此,Route
指令允许您根据Future
的完成情况定义onComplete
,您无法使用预先存在的{Future
来自{{1}}本身的{1}}。