Как я могу сгладить эту структуру 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
определяется здесь.
Ответы
Ответ 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
-понимание, см. здесь.