Как использовать возвращаемое значение из функции, возвращающей Future (Either [A, B]) в scala?

У меня есть функция ниже.

def get(id: Int): Future[Either[String, Item]] = {
    request(RequestBuilding.Get(s"/log/$id")).flatMap { response =>
      response.status match {
        case OK => Unmarshal(response.entity).to[Item].map(Right(_))
        case BadRequest => Future.successful(Left(s"Bad Request"))
        case _ => Unmarshal(response.entity).to[String].flatMap { entity =>
          val error = s"Request failed with status code ${response.status} and entity $entity"
          Future.failed(new IOException(error))
        }
      }
    }
  }

Я пытаюсь вызвать эту функцию, но не знаю, как узнать, возвращает ли она строку или элемент. Ниже моя неудачная попытка.

Client.get(1).onComplete { result =>
        result match {
          case Left(msg) => println(msg)
          case Right(item) => // Do something
        }
      }

person Priya R    schedule 21.02.2016    source источник


Ответы (1)


onComplete принимает функцию типа Try, поэтому вам нужно будет выполнить двойное сопоставление на Try и в случае успеха на Either

Client.get(1).onComplete {
  case Success(either) => either match {
    case Left(int) => int
    case Right(string) => string
  }
  case Failure(f) => f
}

Но гораздо проще было бы составить карту будущего:

Client.get(1).map {
  case Left(msg) => println(msg)
  case Right(item) => // Do something
}

и если вы хотите обработать Failure часть onComplete, используйте recover или recoverWith после сопоставления в будущем.

person Ende Neu    schedule 21.02.2016
comment
onComplete возвращает Unit, а не Try. Требуется функция с аргументом типа Try. - person Łukasz; 21.02.2016