scala.concurrent.onComplete和akka.http.scaladsl.server.directives.onComplete之间的区别

时间:2015-12-23 01:28:43

标签: scala akka-http

在scala并发包中,onComplete方法在akka-http指令中没有返回任何内容,它返回Directive1。

这是唯一的区别吗?我有时对这两种方法感到困惑。

1 个答案:

答案 0 :(得分:1)

这些方法的目的不同,但它们的相关之处在于,akka http Future旨在完成onComplete以完成路由请求。

并发FutureFuture上的一种方法,用于在Future完成后执行某种副作用。 map上有很多其他方法,例如flatMapfilterFuture,当您进行一系列转换时会生成另一个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}}。