Scala 播放框架忽略以下贴图/平面贴图

Scala 播放框架忽略以下贴图/平面贴图,scala,playframework,reactive-programming,Scala,Playframework,Reactive Programming,有没有办法在没有失败的情况下忽略以下map/flatmap 这就是我所拥有的: def delete(serverId: UUID) = authAction.async { implicit request => val user = request.user.get serverService.findByIdAndUserId(serverId, user.id.get) .flatMap{s => if (s.isEmpty)

有没有办法在没有
失败的情况下忽略以下map/flatmap

这就是我所拥有的:

  def delete(serverId: UUID) = authAction.async { implicit request =>
    val user = request.user.get
    serverService.findByIdAndUserId(serverId, user.id.get)
      .flatMap{s =>
        if (s.isEmpty) {
          Future.failed(new DeleteFailedException)
          // Can I return a `NotFound("...")` here instead of failed?
        } else {
          Future.successful(s.get)
        }
      }
      .map{s =>
        serverService.delete(s)
      }.map{_ =>
      Ok(Json.toJson(Map("success" -> "true")))
    }
  }

当我在
flatMap
中返回
NotFound(“…”)
时,仍将执行以下
map
。有没有办法忽略以下映射/平面映射?

而不是执行Future.failed,出现异常。您也可以返回一个。这两种方法的优点都是,您可以对其进行模式匹配,然后构造适当的http响应

def delete(serverId: UUID) = authAction.async { implicit request =>
  val user = request.user.get
  serverService.findByIdAndUserId(serverId, user.id.get)
    .flatMap{s =>
      if (s.isEmpty) {
        Left(new DeleteFailedException)
      } else {
        Right(s.get)
     }
   }
   .map{s => s match {
     case Left(notFound) => 
        // construct the Json for failure
     case Right(s) => 
        serverService.delete(s)
        // construct json for success.
   }}
 }

而不是执行Future.failed,出现异常。您也可以返回一个。这两种方法的优点都是,您可以对其进行模式匹配,然后构造适当的http响应

def delete(serverId: UUID) = authAction.async { implicit request =>
  val user = request.user.get
  serverService.findByIdAndUserId(serverId, user.id.get)
    .flatMap{s =>
      if (s.isEmpty) {
        Left(new DeleteFailedException)
      } else {
        Right(s.get)
     }
   }
   .map{s => s match {
     case Left(notFound) => 
        // construct the Json for failure
     case Right(s) => 
        serverService.delete(s)
        // construct json for success.
   }}
 }
这样想应该没问题(我假设
findbyianduserid
返回Future[Option[\u]],而不是您在评论中回答的
Option[\u]
)。在我的方法中,我还删除了
get
和不必要的
map

def delete(serverId: UUID) = authAction.async { implicit request =>
  val user = request.user.get

  request.user.flatMap(_.id).fold {
    Future.successfull(NotFound("no user"))
  } {userId =>
    serverService.findByIdAndUserId(serverId, userId).map {
      case None =>
        NotFound("no server")
      case Some(s) =>
        serverService.delete(s)
        Ok(Json.toJson(Map("success" -> "true")))
    }
  }
}
这样想应该没问题(我假设
findbyianduserid
返回Future[Option[\u]],而不是您在评论中回答的
Option[\u]
)。在我的方法中,我还删除了
get
和不必要的
map

def delete(serverId: UUID) = authAction.async { implicit request =>
  val user = request.user.get

  request.user.flatMap(_.id).fold {
    Future.successfull(NotFound("no user"))
  } {userId =>
    serverService.findByIdAndUserId(serverId, userId).map {
      case None =>
        NotFound("no server")
      case Some(s) =>
        serverService.delete(s)
        Ok(Json.toJson(Map("success" -> "true")))
    }
  }
}

serverService.findByIdAndUserId(serverId,user.id.get)
返回
Seq[Option[\u]]]
?你确定吗?因为根据名称,我希望它返回
Option[\u]
,而您的代码看起来完全不正确。您能确认一下吗?@Evgeny这是一个
选项
而不是
Seq[Option]
serverService.findbyianduserid(serverId,user.id.get)
返回
Seq[Option[\u]]
?你确定吗?因为根据名称,我希望它返回
Option[\u]
,而您的代码看起来完全不正确。您能确认一下吗?@Evgeny这是一个
选项
而不是
Seq[Option]
引入什么值,而不是已经提供的选项?如果数据类型是Option[Int],其中Int是已查找的用户ID。那么就不能返回NotFound。因为数据类型不匹配。否。首先,根据原始代码和
flatMap
Future
,使用
的代码将无法工作。其次,这个
flatMap
基本上是多余的。应该完全删除它,并且应该针对
映射中的
选项(
/
部分
)进行模式匹配。引入哪个值而不是已经显示的选项?如果数据类型是Option[Int],其中Int是已查找的用户ID。那么就不能返回NotFound。因为数据类型不匹配。否。首先,根据原始代码和
flatMap
Future
,使用
的代码将无法工作。其次,这个
flatMap
基本上是多余的。应将其完全移除,并应针对
地图中的
选项
/
部分
)进行模式匹配