Подтвердить что ты не робот

Как я могу сгладить эту структуру Future [T]?

В следующем примере:

  val handler : Connection = new DatabaseConnectionHandler()
  val result : Future[Future[Future[Option[ResultSet]]]] = handler.connect
    .map( (parameters) => handler )
    .map( connection => connection.sendQuery("BEGIN TRANSACTION SERIALIZABLE") )
    .map( future => future.map( query => query.rows ) )
    .map( future => handler.sendQuery("COMMIT").map( query => future ) )

Можно ли сгладить его, чтобы получить Future[Option[ResultSet]] в конце вместо этого будущего внутри будущего внутри будущей структуры в Scala?

В настоящее время я использую Scala 2.10 Future and Promise, но я не могу найти способ этого. Я знаю, что могу использовать вложенные обратные вызовы, но я бы предпочел избежать этого, так как код будет выглядеть ужасно.

Показатель Connection определяется здесь.

4b9b3361

Ответ 1

Всякий раз, когда вы map с аргументом типа A => Future[B], вы действительно должны использовать flatMap.

Тогда код будет выглядеть следующим образом:

  val connection : Connection = new DatabaseConnectionHandler( DefaultConfiguration )
  val result: Future[QueryResult] = connection.connect
    .flatMap( _ => connection.sendQuery("BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ") )
    .flatMap( _ => connection.sendQuery("SELECT 0") )
    .flatMap( _ => connection.sendQuery("COMMIT").map( value => query ) )

В качестве альтернативы вы можете использовать для понимания. Он использует flatMap для вас.

val connection : Connection = new DatabaseConnectionHandler( DefaultConfiguration )
val result: Future[QueryResult] = for {
  _ <- connection.connect
  _ <- connection.sendQuery("BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ")
  _ <- connection.sendQuery("SELECT 0")
  queryResult <- connection.sendQuery("COMMIT").map( value => query )
} yield { queryResult }

Ответ 2

Здесь вы должны использовать flatMap вместо map.

flatMap ожидает, что функция fun вернет будущее g и вернет будущее h, удерживая значение из будущего g, возвращаемого fun.

Также подумайте о том, чтобы записать это в for -понимание, см. здесь.