Предположим, что я хочу агрегировать данные из 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(_,_) }
Может ли кто-нибудь сказать мне, что я предпочитаю использовать между аппликациями и монадами для выполнения параллельных вычислений асинхронных вычислений? Каковы плюсы и минусы каждого подхода?