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- понимание, которое делает ваш код более читабельным, свернув глубокое вложение.

Другие вопросы по тегам