【问题标题】:scala returns doesn't conform to required S_scala 返回不符合要求的 S_
【发布时间】:2017-06-07 08:59:50
【问题描述】:

我收到了错误

found   : scala.concurrent.Future[Option[models.ProcessTemplatesModel]]
required: Option[models.ProcessTemplatesModel]

下面是我的函数

def createCopyOfProcessTemplate(processTemplateId: Int): Future[Option[ProcessTemplatesModel]] = {
    val action = processTemplates.filter(_.id === processTemplateId).result.map(_.headOption)
    val result: Future[Option[ProcessTemplatesModel]] = db.run(action)

    result.map { case (result) =>
      result match {
        case Some(r) => {
          var copy = (processTemplates returning processTemplates.map(_.id)) += ProcessTemplatesModel(None, "[Copy of] " + r.title, r.version, r.createdat, r.updatedat, r.deadline, r.status, r.comment, Some(false), r.checkedat, Some(false), r.approvedat, false, r.approveprocess, r.trainingsprocess)
          val composedAction = copy.flatMap { id =>
            processTemplates.filter(_.id === id).result.headOption
          }
          db.run(composedAction)

        }
      }
    }
  }

在这种情况下我的问题是什么?

编辑:

我的控制器功能如下所示:

 def createCopyOfProcessTemplate(processTemplateId: Int) = Action.async {
    processTemplateDTO.createCopyOfProcessTemplate(processTemplateId).map { process =>
      Ok(Json.toJson(process))
    }
  }

是我失败了吗?

【问题讨论】:

  • 您还必须使用函数调用语法更新问题
  • 在上面添加了我的控制器功能
  • case Some(r)Option 类型,但您的结果是 Future[Option[ProcessTemplatesModel]],这就是错误。
  • 有什么解决办法?
  • 这取决于db.run(action)的输出是什么。

标签: scala playframework slick


【解决方案1】:

根据您的代码 - 存在以下问题:

  1. 您使用两个db.run 返回期货,但内部未来将 不完整。为了解决它,你应该用 flatMapfor-comprehension
  2. 您只使用一个偏函数case Some(_) => 进行模式匹配 并且不要处理另一个值None
  3. 您只能使用一个 db.run 和操作组合。

你的代码可以是这样的:

def createCopyOfProcessTemplate(processTemplateId: Int): Future[Option[ProcessTemplatesModel]] = {
    val action = processTemplates.filter(...).result.map(_.headOption)

    val composedAction = action.flatMap {
       case Some(r) =>
           val copyAction = (processTemplates returning processTemplates...)
           copyAction.flatMap { id =>
               processTemplates.filter(_.id === id).result.headOption
           }
       case _ => 
           DBIO.successful(None) // issue #2 has been resolved here
    }

    db.run(composedAction)       // issue #3 has been resolved here
  }

我们摆脱了问题 #1(因为我们使用动作组合)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-10
    • 2018-05-15
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多