play framewoerk & scala Future (s) цепочка.сделать его более красивым - PullRequest
0 голосов
/ 21 февраля 2019

Я использую 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 Ответ

0 голосов
/ 21 февраля 2019

Это именно та ситуация, в которой for -разумия Scala призваны помочь.Вы можете заменить ваш код следующим:

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

...