12

给定以下示例:

  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 和 Promise,但我找不到解决方法。我知道我可以使用嵌套回调,但我宁愿避免这种情况,因为代码看起来很糟糕。

Connection特征在这里定义。

4

2 回答 2

25

每当您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 }
于 2013-04-05T13:37:42.937 回答
8

您应该在这里使用 aflatMap而不是 a map

flatMap期望一个函数fun返回一个未来,g并返回h持有来自返回的未来的值的g未来fun

此外,请考虑在for-comprehension 中编写此内容,请参阅此处的方法。

于 2013-04-05T13:38:00.337 回答