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}
我正在使用 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}