2017-10-04 13 views
0

Salut je le bloc de code suivantefficacité du code play framework scala et problèmes futurs

processSteps.map { 
      step => 
      val prerequisiteFuture = processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get) 
      prerequisiteFuture.map(prereqTemplates => { 
       processTemplateDTO.getProcessTemplates(prereqTemplates).map(pres => { 
       step.stepPrerequisites = Some(pres) 
       // Fetches the ProcessStep Prerequisites 
       processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get).map(processStepPrerequisites => { 
        processStepPrerequisites.map(processStepPrerequisite => { // Eintzelne Vorbedingung 
        // Feteches The Reference to the Process Step Prerequisite Template 
        processStepPrerequisitesDTO.getProcessStepsPrerequisiteProcessTemplate(step.id.get).map(preReqs => { 
         preReqs.foreach(preReqRelation => { 
         processStepPrerequisite.processTemplate_id = preReqRelation.processtemplate 
         processStepPrerequisite 
         }) 
        }) 
        processStepPrerequisites 
        }) 
        step.prerequisites = Some(processStepPrerequisites) 
       }) 
       step 
       }) 
      }) 

Je veux chercher des données de base de données et je dois reorganisate les quelques données.

Il fonctionne ... mais pas bien

problèmes sont:

1) Code n'est pas efficace 2) Souvent, il retourne l'étape au et sans la partie middple avec le processStepPrerequisite est terminé

Quelle serait une bonne façon intelligente de résoudre ce problème? grâce

enter image description here

+0

Le code gagnerait "beaucoup" en lisibilité en utilisant pour la compréhension – cchantep

Répondre

1

Vous pouvez utiliser une pour la compréhension pour faire vos affaires de la manière suivante:

val preReqFuture = for{ 
    step <- processSteps 
    prereqTemplates <- processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get) 
    pres <- processTemplateDTO.getProcessTemplates(prereqTemplates) 
    processStepPrerequisites <-processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get) 
    preReqs <- processStepPrerequisitesDTO.getProcessStepsPrerequisiteProcessTemplate(step.id.get) 
} yield (step, pres, processStepPrerequisites, preReqs) 

preReqFuture.map{ (step, pres, processStepPrerequisites, preReqs) => 
    processStepPrerequisites.map(processStepPrerequisite => { 
     preReqs.foreach(preReqRelation => { 
      processStepPrerequisite.processTemplate_id = preReqRelation.processtemplate 
      processStepPrerequisite 
     }) 
    }) 
    step.stepPrerequisites = Some(pres) 
    step.prerequisites = Some(processStepPrerequisites) 
    step 
}.recover { 
    case error: Throwable => //Deal with error 
} 

Note: Je suppose que processSteps est aussi un avenir.

+0

slick l'extrait de postet ci-dessus est dans une Future.sequence() Quand je copie votre codeI a eu beaucoup d'erreurs – Felix

+0

est un processSteps un avenir? –

+0

oui c'est un avenir – Felix

1

Si vous voulez, step à retourner lorsque toutes les actions sont terminées, il suffit de retourner dans le dernier bloc map. Pour l'efficacité de votre code, le problème est probablement pas dans l'extrait que vous avez fourni mais dans les méthodes processStepPrerequisitesDTO.

+0

Essayé cela, mais n'a pas changé le comportement. Dans les DTO j'ai seulement des appels de base de données avec – Felix