【问题标题】:playframework scala code efficiency and future problemsplayframework scala 代码效率和未来问题
【发布时间】:2018-03-15 19:20:03
【问题描述】:

您好,我有以下代码块

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)通常它会在processStepPrerequisite结束时返回步骤并且没有中间部分

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

【问题讨论】:

  • 使用 for comprehension 代码的可读性会“大大提高”

标签: scala playframework playframework-2.0


【解决方案1】:

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

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 也是 Future。

【讨论】:

  • 上面的 postet sn-p 在 Future.sequence() 当我复制你的代码时我得到了很多错误
  • processSteps 是未来吗?
  • 你能发布错误吗?如果没有看到错误,我就忍不住了。
  • found : scala.concurrent.Future[(models.ProcessStepTemplatesModel, Seq[models.ProcessTemplatesModel], Seq[models.ProcessStepPrerequisitesModel], Seq[models.ProcessStepPrerequisiteProcessTemplateModel])]
  • required: scala.collection.GenTraversableOnce[?] [error] prereqTemplates &lt;- processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get)
【解决方案2】:

如果您希望在所有操作完成后返回step,只需在最后一个map 块中返回它即可。

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

【讨论】:

  • 试过了,但没有改变行为。在 DTO 中,我只有使用 slick 的数据库调用
猜你喜欢
  • 2018-03-18
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2018-03-15
  • 2012-07-28
  • 1970-01-01
  • 2014-01-17
  • 2011-10-30
相关资源
最近更新 更多