在Scala中回归未来的未来

时间:2017-02-07 03:09:12

标签: scala playframework

在下面的代码中,我必须返回在另一个未来之后调用的未来结果。我在future2.map行中收到以下错误:

  

类型不匹配;发现:scala.concurrent.Future [play.api.mvc.Result]   必需:play.api.mvc.Result

如何使这项工作?

def method1 = Action.async { request => 
    val future1 = f1
    future1.map { result1 =>
          val future2 = f2
          future2.map { result2 =>
              Ok(result1+result2+"")
          }
    }
}

def f1 = Future { 1 }
def f2 = Future { 2 }

2 个答案:

答案 0 :(得分:4)

你可以通过多种方式做到这一点。但首先,您需要了解mapflatMap如何与Future合作:

def map[S](f: (T) ⇒ S): Future[S]
def map[S](f: (T) ⇒ Future[S]): Future[Future[S]]
def flatMap[S](f: (T) ⇒ Future[S]): Future[S]

请注意,在上述签名中,您使用的值mapflatMapalready is a future来调用Future[<some-value>].map(...)Future[<some-value>].flatMap(...)。< / em>的

方法1:

    def method1 = Action.async { request =>
    val future1 = f1
    future1.flatMap { result1 => //replaced map with flatMap
      val future2 = f2
      future2.map { result2 =>
        Ok(result1+result2+"")
      }
    }
  }

  def f1 = Future { 1 }
  def f2 = Future { 2 }

方法2:

def method1 = Action.async { request =>
    val future1 = f1
    future1.flatMap { result1 => //replaced map with flatMap
      val future2 = f2
      future2.flatMap { result2 => //replaced map with flatMap
        Future.successful{Ok(result1+result2+"")} // used Future.successful{} to generate a Future of Result
      }
    }
  }

  def f1 = Future { 1 }
  def f2 = Future { 2 }

答案 1 :(得分:3)

future1.map更改为future1.flatMap应该可以解决问题。通过Future进行映射会返回另一个Future并更改其中的值。在这种情况下,您要返回的Future包含另一个 Future,其中包含Result。通过使用flatMap,它基本上将嵌套的Future[Future[Result]]展平为Future[Result]