2017-10-04 5 views
1

J'ai un problème avec le code suivantscala play framework suppression future et l'affecter

val prerequisiteFuture = processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get) 
prerequisiteFuture.map(prereqTemplates => { 
    processTemplateDTO.getProcessTemplates(prereqTemplates).map(pres => { 
    step.stepPrerequisites = Some(pres) 
    step.prerequisites = processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get).map(preReqs => { 
     preReqs 
    }) 
    step 
    }) 
}) 

de problème est le suivant: enter image description here

found : scala.concurrent.Future[Seq[models.ProcessStepPrerequisitesModel]]* [error] required: Option[Seq[models.ProcessStepPrerequisitesModel]]

Comment puis-je supprimer l'avenir ? Merci

+0

Quel est le type de processTemplateDTO.getProcessTemplates (..)? – Nyavro

+0

le type est 'Future [Seq [ProcessStepPrerequisitesModel]]' – Felix

Répondre

0

J'ai une solution de travail maintenant:

val prerequisiteFuture = processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get) 
      prerequisiteFuture.map(prereqTemplates => { 
       processTemplateDTO.getProcessTemplates(prereqTemplates).map(pres => { 
       step.stepPrerequisites = Some(pres) 

       processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get).map(b => 
        step.prerequisites = Some(b)) 

       step 
       }) 
      }) 
5

Il n'y a aucun moyen de se débarrasser de Future sauf si vous attendez que le futur se termine finalement dans le pipeline de traitement.

Transformez le futur en utilisant map et flatMap ou for-comprehension.

Disons que vous avez def foo: Future[A] et que vous voulez B

Transform l'avenir

foo.map(toB) 

Maintenant, vous obtiendrez Future[B]. Mais il n'y a aucun moyen d'obtenir la valeur B sans avoir terminé l'exécution.

Sans attendre, la seule façon de se débarrasser de Future est d'attendre que l'opération se termine mais le type de retour sera Unit.

futureComputation.onComplete { 
    case Success(_) => 
    case Failure(_) => 
} 

pas une bonne pratique

import scala.concurrrent.duration._ 

Try(Await.result(prerequisiteFuture, 10.seconds)).toOption 

Plus d'infos: How risky is it to call Await.result on db calls

+0

attendre n'est pas ce que je m'attends à utiliser ... – Felix

+0

problème n'est pas l'asynchronisme de scala ... problème est le mauvais type – Felix

+0

aussi sur Complet n'est pas la réponse de ma question – Felix

2

Vous ne pouvez pas supprimer tout avenir parce que l'avenir abstracts la valeur qui est probablement pas encore calculé. Comme je peux le voir à partir de votre code, vous essayez d'initialiser des champs mutables de pas en mappant des futurs. C'est définitivement faux.

Essayez d'utiliser pour la compréhension pour cela:

val combinedFuture = for { 
    v1 <- methodReturningFuture1 
    v2 <- methodReturningFuture2 
    v3 <- methodReturningFuture3 
} yield (v1,v2,v3) 
+0

Puis-je nicher «pour le rendement» dans un autre «pour le rendement»? – Felix