Rozważ poniższy kod:

class TestActor extends Actor {
  def receive = {

    case "hello" => 
      sender ! Future {
        "Sample future result"
      }
  }
}

Mam poniższą trasę zdefiniowaną:

def r5: Route = {
    pathPrefix("check") {
      onSuccess(system.actorOf(Props[TestActor]).ask("hello")) {
        successResult =>
          complete {
            "The result is " + successResult
          }
      }
    }
  }

Po uzyskaniu dostępu do trasy, dostaję wyjście jako The result is Success(Sample future result), kiedy spodziewałem się, że będzie The result is Sample future result. Z Dokumentów Oto o Onsuccess:

Oceniając swój parametr przyszłości typu [t], a gdy przyszłość została zakończona pomyślnie, wyznaje swój wynik jako wartość typu T i przekazuje go wewnętrzną trasą.

A podany przykład to:

val route =
  path("success") {
    onSuccess(Future { "Ok" }) { extraction =>
      complete(extraction)
    }
  }

Więc gdzie idę źle?

1
codingsplash 16 luty 2017, 10:37

2 odpowiedzi

Najlepsza odpowiedź

ask zwraca Future[T]. Twoja obsługa meczu wzoru wewnątrz receive rzuca go w dodatkowym Future[T], więc otrzymujesz Future[Future[String]].

Jeśli chcesz tylko pobrać T, usuń Future z TestActor:

case class TestResult(s: String)
case "hello" => 
  sender ! TestResult("Sample future result")
2
Yuval Itzchakov 16 luty 2017, 07:48

Jeśli użycie zapytania jest nieuniknione, w trasie R5, musisz otworzyć przyszłość dwa razy, jak otrzymujesz przyszłość [Przyszłość [String]].

On Complete rozpakuje się i możesz mieć

  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")
        
      }
    }
  }
0
Arpan Patro 27 luty 2017, 06:37