Как совместить 2 фьючерса в Scala - PullRequest
0 голосов
/ 28 января 2019

Я пишу CRUD rest api, и у меня возникла проблема с объединением 2 фьючерсов на сервисном уровне.

Идея состоит в том, чтобы вставить Entity в db, а затем извлечь все сгенерированные db значения по id.

Я пробовал andThen (), как в Java, но он не может вернуть Future [Entity], он говорит, что это все еще Future [Long]

class Service {
  def find(id: Long): Future[Option[Entry]] = db.run(repo.findEntry(id))

  //TODO Fails: Expression of type Future[Long] doesn't conform to expected type Future[Option[Entity]]
  def insert(): Future[Option[Entry]] = db.run(repo.insertEntry())
            .andThen { case Success(id) =>
                find(id)
            }
}

class Repository {
  def findEntry(id: Long): DBIO[Option[Entry]] =
    table.filter(_.id === id).result.headOption

  def insertEntry()(implicit ec: ExecutionContext): DBIO[Long] =
    table returning table.map(_.id) += Entry()
}

Я чувствую себя какОтвет достаточно прост, но просто не могу его найти.

1 Ответ

0 голосов
/ 28 января 2019

andThen для побочных эффектов, он по-прежнему возвращает исходный результат (первого Будущего).

Вы хотите flatMap.

 db.run(repo.insertEntry())
   .flatMap( id => find(id) )

flatMap такжепоставляется со специальным синтаксисом, который большинство людей находят более читабельным (после того, как привыкнут к нему), особенно если есть дополнительные шаги:

 for {
   id <- db.run(repo.insertEntry())
   entry <- find(id)
 } yield entry
...