scala - 我怎样才能压平这个 Future[T] 结构?

标签 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 ) )

是否可以将其展平以接收 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/

相关文章:

scala - 模式匹配中的大量嵌套匹配...情况

scala - 从 Supervisor 重新启动后向 actor 发送消息

javascript - 如何将同步ajax转换为异步?

ios - Objective-C 中的同步和异步调用与多线程有什么区别?

java - 改进 ExecutorService 以在超过 1 个 cpu 上执行进程

scala - 在 Akka Actors 中使用 Futures

scala - 如何使用chisel模块作为包

python:使用队列将字典传递给另一个线程

scala - 如何发现未追踪的 future ?

java - 从 Java 代码访问 Scala 对象