在 Akka HTTP 中提取未来
Extracting future in Akka HTTP
考虑以下代码:
class TestActor extends Actor {
def receive = {
case "hello" =>
sender ! Future {
"Sample future result"
}
}
}
我定义了以下路线:
def r5: Route = {
pathPrefix("check") {
onSuccess(system.actorOf(Props[TestActor]).ask("hello")) {
successResult =>
complete {
"The result is " + successResult
}
}
}
}
当我访问路线时,我得到的输出是 The result is Success(Sample future result)
,而我预期它是 The result is Sample future result
。来自关于 onSuccess 的文档 here:
Evaluates its parameter of type Future[T], and once the Future has
been completed successfully, extracts its result as a value of type T
and passes it to the inner route.
给出的例子是:
val route =
path("success") {
onSuccess(Future { "Ok" }) { extraction =>
complete(extraction)
}
}
那么我哪里错了?
ask
returns一个Future[T]
。 receive
中的模式匹配处理程序将其包装在一个额外的 Future[T]
中,因此您将获得 Future[Future[String]]
.
如果您只想检索 T
,请从 TestActor
中删除 Future
:
case class TestResult(s: String)
case "hello" =>
sender ! TestResult("Sample future result")
如果使用 ask 是不可避免的,那么在 r5 路由的 onComplete 中,您需要在收到 Future[Future[String]] 时打开两次 Future。
on Complete 会打开一个,你可以
def r5: Route = {
pathPrefix("check") {
onSuccess(system.actorOf(Props[TestActor]).ask("hello")) {
successResult => {
successResult.Oncomplete {
case Success(res) => {
complete {
"The result is " + res //res will have Sample Future Result }
case Failure(ex) => complete("Some Error Occured")
}
}
}
考虑以下代码:
class TestActor extends Actor {
def receive = {
case "hello" =>
sender ! Future {
"Sample future result"
}
}
}
我定义了以下路线:
def r5: Route = {
pathPrefix("check") {
onSuccess(system.actorOf(Props[TestActor]).ask("hello")) {
successResult =>
complete {
"The result is " + successResult
}
}
}
}
当我访问路线时,我得到的输出是 The result is Success(Sample future result)
,而我预期它是 The result is Sample future result
。来自关于 onSuccess 的文档 here:
Evaluates its parameter of type Future[T], and once the Future has been completed successfully, extracts its result as a value of type T and passes it to the inner route.
给出的例子是:
val route =
path("success") {
onSuccess(Future { "Ok" }) { extraction =>
complete(extraction)
}
}
那么我哪里错了?
ask
returns一个Future[T]
。 receive
中的模式匹配处理程序将其包装在一个额外的 Future[T]
中,因此您将获得 Future[Future[String]]
.
如果您只想检索 T
,请从 TestActor
中删除 Future
:
case class TestResult(s: String)
case "hello" =>
sender ! TestResult("Sample future result")
如果使用 ask 是不可避免的,那么在 r5 路由的 onComplete 中,您需要在收到 Future[Future[String]] 时打开两次 Future。
on Complete 会打开一个,你可以
def r5: Route = {
pathPrefix("check") {
onSuccess(system.actorOf(Props[TestActor]).ask("hello")) {
successResult => {
successResult.Oncomplete {
case Success(res) => {
complete {
"The result is " + res //res will have Sample Future Result }
case Failure(ex) => complete("Some Error Occured")
}
}
}