Я медленно обворачиваю свой мозг вокруг Futures в Scala, и у меня есть кусочек торта, который я пытаюсь разгадать.Заблудшиеся в Scala Futures
Конкретный вариант использования - DeferredResolver
в sangria-graphql + akka. Я украл их демо-код, который выглядит так:
Future.fromTry(Try(
friendIds map (id => CharacterRepo.humans.find(_.id == id) orElse CharacterRepo.droids.find(_.id == id))))
и добавил к нему свою собственную модификацию. Их делают поиск в памяти, в то время как мои просит что-то другой актер:
Future.fromTry(Try(
accountIds match {
case h :: _ =>
val f = sender ? TargetedMessage(h)
val resp = Await.result(f, timeout.duration).asInstanceOf[TargetedMessage]
marshallAccount(resp.body)
case _ => throw new Exception("Not found")
}
))
Соответствующая часть здесь является то, что я выбираю первый элемент в списке, отправьте его на ActorRef
, что я получил в другом месте и ждать результат. Это работает. То, что я хотел бы сделать, однако, не должны ждать результата здесь, но вернуть все это как Future
Future.fromTry(Try(
accountIds match {
case h :: _ =>
sender ? TargetedMessage(h) map {
case resp:TargetedMessage => marshallAccount(resp.body)
}
case _ => throw new Exception("Not found")
}
))
Это не работает. При этом потребляется, вместо того, чтобы быть типа Account
(тип возвращаемого функцией marshallAccount
, это типа Promise. Если я правильно понимаю, это потому, что вместо того, чтобы иметь тип возвращаемого Future[Account]
, это имеет тип Future[Future[Account]]
Как сгладить это