playframework scala代码效率和未来问题

时间:2017-10-04 11:52:37

标签: scala playframework playframework-2.0

您好我有以下代码块

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

我想从数据库中获取一些数据,然后我必须重新组织一些数据。

它有效......但不是很好

问题是:

1)代码效率不高 2)通常它会在没有middple部分的情况下返回步骤processStepPrerequisite已完成

解决这个问题的好方法是什么?感谢

enter image description here

2 个答案:

答案 0 :(得分:1)

如果需要,在完成所有操作后返回step,只需在最后map块中返回它。

为了提高代码的效率,问题可能不在您提供的代码段中,而是在processStepPrerequisitesDTO方法中。

答案 1 :(得分:1)

您可以通过以下方式使用for comprehension来完成您的工作:

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
}

注意:我假设processSteps也是未来。