Scala для понимания, как избежать создания Future при передаче результатов

Я использую асинхронные функции Playframework и Slick, но не знаю, как работать с результатами из метода возврата Future в одном для понимания. Сейчас делаю так:

def getWordDefinitions(checkedWordsIds: List[CheckedWord]) : Future[List[WordDefinition]] = {
  val ids = checkedWordsIds.map(_.wordId)

  for {
    translations <- translationRepo.findByIds(ids)
    translations2 <- Future(sortByHowManyChecks(checkedWordsIds, translations))
    wordDefinitionsList <- Future(translations2.map(translation => WordDefinition(translation._2.english, translation._2.translation)))
  } yield {
    wordDefinitionsList
  }
}

Я хочу знать, как избавиться от translations2 ‹- Future(), кроме того, чтобы переместить его в функцию (или обернуть функцию в другую, которая возвращает Future). Функция sortByHowManyChecks возвращает Map[Long, TranslationObject], которая находится в сторонней библиотеке.


person foldLeftReduce    schedule 07.08.2017    source источник


Ответы (2)


В вашем случае вы можете просто написать это так:

def getWordDefinitions(checkedWordsIds: List[CheckedWord]) : Future[List[WordDefinition]] = {
  val ids = checkedWordsIds.map(_.wordId)

  for {
    translations <- translationRepo.findByIds(ids)
    translations2 = sortByHowManyChecks(checkedWordsIds, translations)
  } yield translations2.map(translation => WordDefinition(translation._2.english, translation._2.translation))
}
person michaJlS    schedule 07.08.2017

Что вы думаете о том, чтобы вообще не использовать yield? Не уверен, правильно ли я понял все операторы возврата.

def getWordDefinitions(checkedWordsIds: List[CheckedWord]) : Future[List[WordDefinition]] = {
  val ids = checkedWordsIds.map(_.wordId)

  translationRepo.findByIds(ids)
    .map(translations => sortByHowManyChecks(checkedWordsIds, translations))
    .map(translation => WordDefinition(translation._2.english, translation._2.translation))
}
person Julian Pieles    schedule 07.08.2017