我很可能没有恰当地使用For
理解,但我认为我的问题相对普遍。我在Play动作中创建了两个Futures
。
即使我可以在Future
之外实例化这些for
以使它们有机会并行运行,但我希望它们按顺序排列,因为我只想要第二个{{1}如果在缓存中找到Future
,则创建(Web服务调用)。
value
我的问题
当我执行上述操作,并且在缓存中找不到for {
value <- getValueFromCache // Future[Option[String]]
wsResponse <- callWebService(value) // Future[WSResponse]
} yield wsResponse
时,仍会创建/执行第二个Future(Web服务调用) - 我不想要。
我对value
理解的理解是,即使第二个任务不直接依赖于第一个任务,第二个任务只有在第一个任务成功完成时才会运行。
如果在缓存中找不到for
,value
这就是第二个value = None
仍然被创建/执行的原因 - 因为Future
仍然被认为是第一个None
成功完成了吗?
在什么情况下,第二个Future
无法创建 - 当且仅当第一个Future
以Future
完成时才会生成?
我正在考虑使用Exception
类型的陈述,但这仍然让我理解if 1st not complete properly then do not continue
如何处理一个很大的差距。
答案 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