我怎样才能展现这种Future [T]结构?

时间:2013-04-05 13:27:42

标签: scala asynchronous future

给出以下示例:

  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

2 个答案:

答案 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