2017-08-07 1 views
0

J'utilise les fonctionnalités asynchrones Playframework et Slick, mais je ne suis pas sûr de savoir comment travailler en ligne avec les résultats de la méthode de retour dans l'un pour la compréhension. En ce moment je fais de telle manière:Scala pour la compréhension comment éviter la création de l'avenir lors de la transmission des résultats

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 
    } 
} 

Je veux savoir comment se débarrasser de translations2 < - Future(), en plus se déplacer à la fonction (ou fonction envelopper dans un autre qui retourne l'avenir). La fonction sortByHowManyChecks renvoie Map [Long, TranslationObject] qui se trouve dans une bibliothèque tierce.

Répondre

0

Dans votre cas, vous pouvez simplement écrire cette façon:

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)) 
} 
0

Que pensez-vous de ne pas utiliser le rendement du tout? Je ne sais pas si j'ai reçu toutes les déclarations de retour.

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)) 
}