您如何将火烧掉并忘记未来以进行理解?
How do you thread a fire and forget future into a for comprehension?
我有一个涉及通过 3 个步骤处理文件上传的用例:
- 在数据库中创建条目
- 从文件中提取元数据并使用之前的 ID 存储在数据库中
- 将文件存储在云文件夹中
我希望第 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 ()
评论中建议的其他方法无效,因为:
- 我不想在
extractAndSaveMetadata
或 storeField
return 之后 return。只有 1 个主要路径是 createEntry andThen storeFile
- 这确实是一个任务序列,没有第一个任务中的id你就不能运行2和3。
- 使用
Future.sequence
会阻塞整个上游线程,直到所有 futures 完成。我想 return 尽快控制。
我有一个涉及通过 3 个步骤处理文件上传的用例:
- 在数据库中创建条目
- 从文件中提取元数据并使用之前的 ID 存储在数据库中
- 将文件存储在云文件夹中
我希望第 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 ()
评论中建议的其他方法无效,因为:
- 我不想在
extractAndSaveMetadata
或storeField
return 之后 return。只有 1 个主要路径是createEntry andThen storeFile
- 这确实是一个任务序列,没有第一个任务中的id你就不能运行2和3。
- 使用
Future.sequence
会阻塞整个上游线程,直到所有 futures 完成。我想 return 尽快控制。