Итерация последовательности будущего в последовательности фьючерсов - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю над приложением PlayFramework, написанным на Scala.

Проблема в том, что в контроллере отдыха мне нужен список элементов (книг) и для каждого списка элементов его подэлементов (глав).

Хранилище книг:

def findAll(): Future[Seq[Book]] 

Хранилище глав:

def findByBookId(bookId: UUID): Future[Seq[Chapter]]

Я хотел сделать что-то вроде

val books = bookRepository.findAll
val result = for {
  bookList <- books
  book <- bookList
  chapters <- chapterRepository.findByBookdId(book.id)
} yield (book, chapters)

Я хочу иметь кортеж книги и ее главы, чтобы потом можно было сопоставить ее с json. Что я делаю не так, потому что я получаю ошибку:

[error]  required: scala.collection.GenTraversableOnce[?]

Или что может быть лучше, как перебирать будущее коллекции и для каждого элемента загружать другое будущее коллекции?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Посмотрите, приближает ли это вас к тому, что вы ищете.

// found books (future)
val fBooks :Future[Seq[Book]] = bookRepository.findAll()

// chapters in fBooks order (future)
val fChptrs :Future[Seq[Seq[Chapter]]] = fBooks.flatMap {books =>
  Future.sequence(books.map(book =>findByBookId(book.id)))
}

// combine book with its chapters
val result :Future[Seq[(Book, Seq[Chapter])]] = for {
  books <- fBooks
  chptrs <- fChptrs
} yield books zip chptrs
0 голосов
/ 18 сентября 2018

Вы должны использовать один и тот же тип для всего для понимания.

Вы не можете иметь books:Future[Seq[Books] и bookList: Seq[Book] в одном и том же для понимания.

Также вы можете конвертировать Seq[Future[Something]] до Future[Seq[Something]] с использованием Future.sequence

Итак, что-то вроде этого должно работать

val res: Future[(Seq[Book], Seq[Chapter])] =
for {
  bookList <- books
  chapters <- Future.sequence(bookList.map(book => findByBookId(book.id)))
} yield (bookList, chapters.flatten)
0 голосов
/ 18 сентября 2018

Вы можете использовать только один тип монады в a для понимания, поскольку это просто синтаксический сахар для flatMap и map.

Смотрите здесь все описание: https://stackoverflow.com/a/33402543/2750966

...