Scala 的理解和选项

Scala for comprehension and options

我正在使用 Scala / Slick 3.1(这一切都是通过 spray-slick-swagger 类型安全激活器实现的)并且有 4 个不同的查询 运行 我想 return 作为一个对象。我正在尝试将所有未来组合成一个未来。

它有效,但问题是如果查询失败(即,我们搜索不存在的内容),则会出现运行时异常。

如果一个查询失败并最终 return 一个 Future[Option]

,我认为我真正的想法是让整个事情失败

整个事情都是通过spray连接起来的

所以查询代码如下所示:

// .. snip .. FindById() 
      val a = db.run(q1.result) // Future[Seq[Tuple]]]
      val b = db.run(q2.result)
      val c = db.run(q3.result)
      val d = db.run(q4.result)

      // compose the futures together into one future
      val res = for {
    resA <- a
    resB <- b
    resC <- c
    resD <- d
  } yield {
       PhoneMerged(resA.head._1, resA.head._2, resB.map( x  => FeaturesSimple(x.featurename)).toList, resD.map(x => FeaturesvaluepairSimple(x.featuretype, x.featurevalue)).toList,
          resC.map(x => IncludedaccessorySimple(x.accessoryvalue)).toList, createPhoneImage(resA.head._1.devicemcd))
    }

它被调用

 onComplete((modules.phonesDAA ? FindById(id)).mapTo[Future[PhoneMerged]]) {
          case Success(phoneOption) =>  {
            println(phoneOption)
            complete(phoneOption)
            }
          case Failure(ex) => {
            println("uh oh")
            complete("{}")
          }
        }

最终我想 return JSON 序列化的 PhoneMerged 对象(如果我搜索有效的 id 就可以工作)或“{}”为空 json ...

有人对如何正确处理结果/处理错误有任何想法吗?

您可以使 FindById 函数 return 成为 Future[Option[PhoneMerged]] 并使用 Future 组合器(例如 recover.
处理内部的失败案例 例如:

  val a = db.run(q1.result)
  // Future[Seq[Tuple]]]
  val b = db.run(q2.result)
  val c = db.run(q3.result)
  val d = db.run(q4.result)

  // compose the futures together into one future
  val res = for {
    resA <- a
    resB <- b
    resC <- c
    resD <- d
  } yield {
      Some(PhoneMerged(resA.head._1, resA.head._2, resB.map(x => FeaturesSimple(x.featurename)).toList, resD.map(x => FeaturesvaluepairSimple(x.featuretype, x.featurevalue)).toList,
        resC.map(x => IncludedaccessorySimple(x.accessoryvalue)).toList, createPhoneImage(resA.head._1.devicemcd)))
    } recover {case e: YourExceptionType => None}