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

Mau*_*res 12 asynchronous scala 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 ) )
Run Code Online (Sandbox Code Playgroud)

Future[Option[ResultSet]]在Scala的未来结构中,是否有可能将其展平以接收最终而不是未来的未来?

我目前正在使用Scala的2.10 Future和Promise,但我无法找到解决方法.我知道我可以使用嵌套回调但我宁愿避免这种情况,因为代码看起来很糟糕.

Connection特性被定义在这里.

Deb*_*ski 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 ) )
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用for-understanding.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 }
Run Code Online (Sandbox Code Playgroud)

  • `scala.concurrent.Future`中没有`flatten` (2认同)
  • @senz是的,`scala.concurrent.Future`没有'flatten`.但是你可以使用`f flatMap identity`.[见这里](https://groups.google.com/forum/#!topic/scala-internals/yVYe_xnUOFA) (2认同)
  • @senz将会出现在scala 2.12中:http://stackoverflow.com/a/36079431/6309 (2认同)

axe*_*l22 8

你应该使用a flatMap而不是maphere.

flatMap预期函数fun返回一个未来g,并返回将来h拿着从未来的价值gfun返回.

另外,考虑在一个for理解中写这个,看看这里怎么样.