对理解中期货的错误理解

时间:2016-03-02 16:38:25

标签: scala playframework playframework-2.0

我很可能没有恰当地使用For理解,但我认为我的问题相对普遍。我在Play动作中创建了两个Futures

  1. 第一个调用我的缓存来获取值
  2. 然后第二个调用Web服务(不依赖于缓存中的值)
  3. 即使我可以在Future之外实例化这些for以使它们有机会并行运行,但我希望它们按顺序排列,因为我只想要第二个{{1}如果在缓存中找到Future,则创建(Web服务调用)。

    value

    我的问题
    当我执行上述操作,并且在缓存中找不到for { value <- getValueFromCache // Future[Option[String]] wsResponse <- callWebService(value) // Future[WSResponse] } yield wsResponse 时,仍会创建/执行第二个Future(Web服务调用) - 我不想要。

    我对value理解的理解是,即使第二个任务不直接依赖于第一个任务,第二个任务只有在第一个任务成功完成时才会运行。

    如果在缓存中找不到forvalue 这就是第二个value = None仍然被创建/执行的原因 - 因为Future仍然被认为是第一个None成功完成了吗?

    在什么情况下,第二个Future无法创建 - 当且仅当第一个FutureFuture完成时才会生成?

    我正在考虑使用Exception类型的陈述,但这仍然让我理解if 1st not complete properly then do not continue如何处理一个很大的差距。

1 个答案:

答案 0 :(得分:6)

  

这就是第二个未来仍然被创造/执行的原因 - 因为“无”仍然被认为是第一个未来的成功完成?

是的,您最终成功完成了Future但包含None,这完全有效。

我不知道callWebService的签名是什么,但如果你想停在None上,你可以filter Future导致它失败,并且for-comprehension中的后续行将不会执行。或者您也可以尝试匹配Option中的值,这也会导致Future None失败。

for {
    value <- getValueFromCache.filter(_.nonEmpty)
    wsResponse <- callWebService(value) // requires `callWebService` to accept an Option
} yield wsResponse

或者

for {
    Some(value) <- getValueFromCache
    wsResponse <- callWebService(value) // requires `callWebService` to accept the type contained in the `Option`
} yield wsResponse

甚至

for {
    value <- getValueFromCache.map(_.get)
    wsResponse <- callWebService(value)
} yield wsResponse