给出以下示例:
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 ) )
在Scala的未来结构中的未来内部,是否有可能将其展平为最终接收Future[Option[ResultSet]]
而不是未来?
我目前正在使用Scala的2.10 Future和Promise,但我无法找到解决方法。我知道我可以使用嵌套回调,但我宁愿避免这种情况,因为代码看起来很糟糕。
Connection
特征定义为here。
答案 0 :(得分:24)
每当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-understanding。 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 }
答案 1 :(得分:8)
您应该在此使用flatMap
代替map
。
flatMap
期望函数fun
返回未来g
并返回未来h
,其中包含来自g
fun
的未来值for
}返回。
另外,考虑在{{1}} - 理解中写一下,看看如何here。