您如何将火烧掉并忘记未来以进行理解?

How do you thread a fire and forget future into a for comprehension?

我有一个涉及通过 3 个步骤处理文件上传的用例:

  1. 在数据库中创建条目
  2. 从文件中提取元数据并使用之前的 ID 存储在数据库中
  3. 将文件存储在云文件夹中

我希望第 2 步以一劳永逸的方式发生,但它需要来自第 1 步的 ID。我希望第 1 步和第 3 步同步发生,并且 return 尽可能快。我的代码如下所示:

def storeFile(): Future[Long]
def extractAndSaveMetadata(id:Long, content:Bytestring) : Future[Unit]
def storeFile(id, Long, content:ByteString): Future[Unit]

for {
  id <- createEntryInDB()
  _ <- extractAndSaveMetadata(id, content)
  _ <- storeFile(id, content)
} yield ()

这种方法的问题是第2步很慢,最终一致没有问题。同时它需要第 1 步中的值,所以我不知道如何在这个 monadic 调用序列中取消调用 fire and forget 调用。

有没有办法在未来的理解中“分叉”未来的执行?

是的,@SwiftMango 指出了解决方案。代码转化为:

for {
  id <- createEntryInDB()
  _ = extractAndSaveMetadata(id, content)
  _ <- storeFile(id, content)
} yield ()

评论中建议的其他方法无效,因为:

  • 我不想在 extractAndSaveMetadatastoreField return 之后 return。只有 1 个主要路径是 createEntry andThen storeFile
  • 这确实是一个任务序列,没有第一个任务中的id你就不能运行2和3。
  • 使用 Future.sequence 会阻塞整个上游线程,直到所有 futures 完成。我想 return 尽快控制。