Reputation: 5619
Hi I have the following code block
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
})
})
I want to fetch some data from database and then I have to reorganisate the some data.
It works ... but not well
Problems are:
1) Code is not efficient
2) Often it returns the step at the and without the middple part with the processStepPrerequisite
is finished
What would be a good and smart way to resolve this? thanks
Upvotes: 0
Views: 90
Reputation: 420
You can use a for comprehension for doing your stuff in the following way:
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: I have assumed that processSteps is also a Future.
Upvotes: 1
Reputation: 6452
If you want, step
to be returned when all the actions are finished, just return it in the last map
block.
For the efficiency of your code, the problem is probably not in the snippet that you have provided but in the processStepPrerequisitesDTO
methods.
Upvotes: 1