나는 이해를 위해 다음이 있습니다. 내 데이터베이스에서 행을 삭제해야하지만 행이 존재하는 경우에만 (따라서 주어진 ID에 대한 뉴스가있는 경우) :
override def deleteNews(newsId: Long): Int = {
val getAndDelete = for {
Some(news) <- newsDao.get(newsId)// returns Future[Option[News]]
delete <- newsDao.remove(news) // returns Future[Int]
} yield delete
Await.result(getAndDelete, responseTimeout)
}
그러나 주어진 ID에 대한 요소가 없을 때 사건을 처리하는 방법을 모르겠습니다. 현재 다음 예외가 발생합니다.
Unexpected exception[NoSuchElementException: Future.filter predicate is not satisfied]
내 접근 방식이 끔찍하지 않기를 바랍니다 .D
저는 스칼라에 비교적 익숙하지 않습니다.
사용 Await
은 그다지 좋은 생각이 아닙니다. 가능한 한 차단을 지연시키는 것이 가장 좋습니다.
IMO, 주어진 ID에 대한 요소가 실패해서는 안됩니다. 그 ID로 아무것도 없으면 newsDao.get
성공적인 미래를 반환해야하며 None
, newsDao.remove
도움이된다면 존재하지 않는 ID를 호출해서는 안되며 , 전체 결과는 성공적으로 0 행을 삭제해야합니다. 계약은 deleteNews
콜과 리턴 사이의 어느 시점에서 관련 행이 없다는 것을 보장하는 것입니다 newsId
(물론 데이터 레이스를 둘러싼 약간의 손 흔들기 ...)).
따라서 newsDao
의 구현을 변경할 수 없다고 가정합니다 .
val getFut: Future[Option[News]] =
newsDao.get(newsId).recover {
// can still fail for other reasons
case _: NoSuchElementException => None
}
// I really prefer map/flatMap directly vs. for-comprehension sugar, especially when dealing with multiple monadicish things
// Not the most succinct, but leaving meaningful names in for documentation
val getAndRemove =
getFut.flatMap { newsOpt =>
newsOpt.map { news =>
newsDao.remove(news)
}.getOrElse(Future.successful(0))
}
여전히 deleteNews
bare를 반환 해야한다면 가끔 예외가 발생하고 이것이 아마도 차선책이라는 것을 받아 들일 Int
수 있습니다 Await.result
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다