发现scala类型不匹配未来[A]预期未来[B]

发现scala类型不匹配未来[A]预期未来[B],scala,future,Scala,Future,对scala来说有点陌生,这里的类型定义和解决方法有些混乱 private def getContract(organizationId: String, sc: SecurityContext): Future[Contract] = { val configRequest = ConfigsActor.ReadConfigRequest(CONFIG_KEY, Option(organizationId))(sc) (configActor ? configRequest

对scala来说有点陌生,这里的类型定义和解决方法有些混乱

  private def getContract(organizationId: String, sc: SecurityContext): Future[Contract] = {
    val configRequest = ConfigsActor.ReadConfigRequest(CONFIG_KEY, Option(organizationId))(sc)
    (configActor ? configRequest).mapTo[Config] andThen {
      case Success(config) =>
        JsonUtil.extract[Contract](config.data)
      case otherwise =>
        log.warning("some unknown case has happened", otherwise)
    }
  }
我希望akka ask返回结果,将其映射到配置。在my and子句中,将其转换为合同类型并返回

但我有一个类型不匹配

[error] 
[error]  found   : scala.concurrent.Future[com.example.service.Config]
[error]  required: scala.concurrent.Future[com.example.service.Contract]
[error]     (configActor ? configRequest).mapTo[Config] andThen
[error]
设计用于执行副作用,而不会在未来改变价值。要转换
未来
中的值,只需映射未来即可

(configActor ? configRequest).mapTo[Config] map { config =>
  JsonUtil.extract[Contract](config.data)
} andThen { case Failure(e) => log.warning("some unknown case has happened", e) }
以下是值得记住的

someFuture
  .map     { value  => /* transform value */ }
  .recover { error  => /* transform error */ }
  .andThen {           /* execute side-effect */
    case Success(value) => logger.info("Successfully ...")
    case Failure(error) => logger.error("Failed to ...", error)
   }
你可以把
看作是
未来的
s。

被设计成执行一个副作用,而不在未来转换价值。要转换
未来
中的值,只需映射未来即可

(configActor ? configRequest).mapTo[Config] map { config =>
  JsonUtil.extract[Contract](config.data)
} andThen { case Failure(e) => log.warning("some unknown case has happened", e) }
以下是值得记住的

someFuture
  .map     { value  => /* transform value */ }
  .recover { error  => /* transform error */ }
  .andThen {           /* execute side-effect */
    case Success(value) => logger.info("Successfully ...")
    case Failure(error) => logger.error("Failed to ...", error)
   }

你可以考虑
,然后
至于
未来
s.

哦,有趣,好吧,让我试试。谢谢谢谢你的回答,所以如果将来发生错误,map不会被调用,它会被恢复吗?@Pita是的,映射成功也是其他错误单子的常见模式,如任选一、选项、尝试等。哦,有趣,好吧,让我试试。谢谢谢谢你的回答,所以如果将来发生错误,map将不会被调用,它将被恢复?@Pita是的,映射到成功也是其他错误monad的常见模式,如任选、Option、Try等。