【发布时间】:2016-03-03 00:49:14
【问题描述】:
很可能我没有正确使用For 理解,但我认为我的问题相对一般。我在 Play Action 中创建了两个 Futures。
- 第一个调用我的缓存来获取值
- 然后第二个调用 Web 服务(但不依赖缓存中的值)
尽管我可以在for 之外实例化这些Futures 以使它们有机会并行运行,但我希望它们按顺序排列,因为我只想要第二个Future(网络服务调用)如果在缓存中找到value,则创建。
for {
value <- getValueFromCache // Future[Option[String]]
wsResponse <- callWebService(value) // Future[WSResponse]
} yield wsResponse
我的问题
当我执行上述操作时,在缓存中找不到 value,仍然会创建/执行第二个 Future(Web 服务调用) - 我不想要。
我对@987654329@理解的理解是,即使第二个任务不直接依赖于第一个,第二个也只有在第一个成功完成的情况下才会运行。
如果在缓存中找不到value,则value = None。
这就是为什么第二个Future 仍然被创建/执行的原因 - 因为None 仍然被认为是第一个Future 的成功完成?
在什么情况下不会创建第二个Future - 当且仅当第一个Future 以Exception 结尾?
我正在考虑使用if 1st not complete properly then do not continue 类型的语句,但这仍然让我对for 如何工作的理解存在很大差距。
【问题讨论】:
标签: scala playframework playframework-2.0