gpt4 book ai didi

scala - For Comprehension 中对 future 的错误理解

转载 作者:行者123 更新时间:2023-12-02 08:22:27 25 4
gpt4 key购买 nike

很可能我没有正确使用 For 理解,但我认为我的问题相对通用。我在 Play Action 中创建了两个 Futures

  1. 第一个调用我的缓存来获取一个值
  2. 然后第二个调用 Web 服务(但是不依赖于缓存中的值)

尽管我可以在 for 之外实例化这些 Future 以让它们有机会并行运行,但我希望它们按顺序排列,因为 我只想如果在缓存中找到 value,则创建第二个 Future(网络服务调用)。

for {
value <- getValueFromCache // Future[Option[String]]

wsResponse <- callWebService(value) // Future[WSResponse]

} yield wsResponse

我的问题
当我执行上述操作时,在缓存中未找到 value 时,第二个 Future(网络服务调用)仍会创建/执行 - 这是我不想要的。

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

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

在什么情况下不会创建第二个 Future - 当且仅当第一个 FutureException 完成时?

我正在考虑使用 if 1st not complete properly then do not continue 类型的语句,但这仍然使我对 for 的工作方式的理解存在很大差距。

最佳答案

Is this why the 2nd Future still gets created/executed - because None is still considered a successful completion of the first Future?

是的,您最终得到一个成功完成但包含NoneFuture,这是完全有效的。

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

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

关于scala - For Comprehension 中对 future 的错误理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35753094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com