假设我想聚合来自 2 个远程服务的数据,并尽可能快地提供响应:
def loadUser: Future[User]
def loadData: Future[Data]
case class Payload(user: User, data: Data)
我知道这个按顺序执行异步任务:
for {
user <- loadUser
data <- loadData
} yield Payload(user,data)
虽然这是并行执行它们,因为异步任务在被顺序链接之前被触发:
val userF = loadUser
val dataF = loadData
for {
user <- userF
data <- dataF
} yield Payload(user,data)
然而,这种差异对我来说有点太隐晦了,可能有人一开始并没有注意到它。
应用程序也解决了工作
(loadUser |@| loadData) { Payload(_,_) }
有人能告诉我我宁愿在应用程序和单子之间使用什么来执行并行异步计算吗?每种方法的优缺点是什么?