在 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)
    }
  }

那么我哪里错了?

askreturns一个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")
        
      }
    }
  }