给出以下示例:
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]]
最后而不是这个 future 在 Scala 的 future 结构中的 future ?我目前正在使用 Scala 的 2.10 Future 和 Promise,但我找不到解决此问题的方法。我知道我可以使用嵌套回调,但我宁愿避免这样做,因为代码看起来很糟糕。
Connection
特征定义 here .
最佳答案
每当您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 ) )
或者,您可以使用 for-comprehension。 It uses
flatMap
for you .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 }
关于scala - 我怎样才能压平这个 Future[T] 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15835222/