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
}
然后我想返回两个列表。但我不知道如何处理例外情况:

  • Db可能的抛出连接无效

  • 远程服务-请求错误或内部服务器错误

  • 双超时异常

  • 但是,当我只有db的结果时,我想返回它。如果我有来自db和远程服务的结果,我想返回两个列表的总和

    如何处理这个案子

    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、 恢复{…}