【问题标题】:How can I flatten this Future[T] structure?我怎样才能展平这个 Future[T] 结构?
【发布时间】:2013-04-05 13:27:41
【问题描述】:

举个例子:

  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 特征定义为 here

【问题讨论】:

    标签: scala asynchronous future


    【解决方案1】:

    当你 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 ) )
    

    或者,您可以使用理解。 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.concurrent.Future中没有flatten
    • @senz 是的,scala.concurrent.Future 没有flatten。但是你可以使用f flatMap identitySee here
    • 您是否在理解中混合了期权和期货?这不是不允许的吗?
    【解决方案2】:

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

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

    另外,考虑在for-comprehension 中编写此内容,看看here 是如何做到的。

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      相关资源
      最近更新 更多