play framewoerk & scala Future(s) цепочка. сделать его более красивым
Я использую WSClient
сделать запросы на отдых. Каждый запрос возвращает несколько Future
,
В результате мне нужно сделать запрос 1 и получить некоторые данные. Затем мне нужно сделать запрос 2 с данными из результата запроса 1. Затем мне нужно сделать запрос 3 с данными из результата запроса 2. и так далее
в моем коде это выглядит
def wsChain(data: Data): Future[NewData] = {
getOne(data).flatMap(data2 => {
getTwo(data2).flatMap(data3 => {
getThree(data3).flatMap(data4 => {
getFour(data4).map(result => foo(result))
})
})
})
}
Это очень примитивный образец без каких-либо изменений ответов и запросов. но я думаю, что даже это трудно читать. Я сейчас о Await
за Future
, но это анти-шаблон
Может быть, я могу сделать это более красиво? Без N внутренних функций.
1 ответ
Это именно та ситуация, что Скала for
-понимания призваны помочь. Вы можете заменить свой код следующим:
def wsChain(data: Data): Future[NewData] = for {
data2 <- getOne(data)
data3 <- getTwo(data2)
data4 <- getThree(data3)
result <- getFour(data4)
} yield foo(result)
... и компилятор обратит внимание на то же самое. Вы можете прочитать больше о for
-понимания здесь, но вкратце, в любое время вы окажетесь с длинной цепью flatMap
звонки (а может и map
в конце), вы должны рассмотреть возможность переписать их как for
- понимание, которое делает ваш код более читабельным, свернув глубокое вложение.