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
基本上是多余的。应将其完全移除,并应针对地图中的选项(无/部分)进行模式匹配