Scala与多重期货合作
我有两个返回Scala与多重期货合作,scala,akka,Scala,Akka,我有两个返回List[Int] // first work with postgresql database object Db { def get: Future[List[Int]] = // impl } // second it's remote service object Rs { def get: Future[List[Int]] = // impl } 然后我想返回两个列表。但我不知道如何处理例外情况: Db可能的抛出连接无效 远程服务-请求错误或内部服务器错误
List[Int]
// first work with postgresql database
object Db {
def get: Future[List[Int]] = // impl
}
// second it's remote service
object Rs {
def get: Future[List[Int]] = // impl
}
然后我想返回两个列表。但我不知道如何处理例外情况:
val total: Future[Int] =
Db.get.flatMap { dbResults =>
Rs.get.map { remoteResults =>
dbResults.sum + remoteResults.sum
}
}
或同等地
val total: Future[Int] = for {
dbResults <- Db.get
remoteResults <- Rs.get
} yield dbResults.sum + remoteResults.sum
(例外情况的名称由以下人员组成)
或同等地
val total: Future[Int] = for {
dbResults <- Db.get
remoteResults <- Rs.get
} yield dbResults.sum + remoteResults.sum
(异常的名称是组合的)您需要组合
flatMap
和recover
:
for {
db <- Db.get
rs <- Rs.get.recover {
case e =>
logger.error("Error requesting external service", e)
List.fill(db.length)(0)
}
} yield (db, rs).zipped.map(_+_).sum
您需要组合
flatMap
和recover
:
for {
db <- Db.get
rs <- Rs.get.recover {
case e =>
logger.error("Error requesting external service", e)
List.fill(db.length)(0)
}
} yield (db, rs).zipped.map(_+_).sum
结果将是失败的未来。非常感谢。是否可以在的
之外处理此错误?一些类似于{…}的`val sum=yield。。。sum.recover{}@lito,您的确切意思是哪个错误?从Rs.get
中获取的一个,还是从整个中获取的一个?如果是前者,则不需要,您以后需要直接处理它-您所能做的最多是提取传递给recover
的部分函数,方法本身仍然需要在那里调用。如果是后者,那么您需要在for
之外进行操作:valf=for{…}yield。。。;f、 恢复{…}
。结果将是失败的未来。非常感谢。是否可以在
的之外处理此错误?一些类似于{…}的`val sum=yield。。。sum.recover{}@lito,您的确切意思是哪个错误?从Rs.get
中获取的一个,还是从整个中获取的一个?如果是前者,则不需要,您以后需要直接处理它-您所能做的最多是提取传递给recover
的部分函数,方法本身仍然需要在那里调用。如果是后者,那么您需要在for
之外进行操作:valf=for{…}yield。。。;f、 恢复{…}
。