A 또는 Promise[A]가 주어지면 단일 Promise[A]를 어떻게 반환할 수 있나요?
-
12-12-2019 - |
문제
예상대로 작동하는 두 가지 기능이 있습니다
def getSomething: Promise[JsValue]
def getSomethingElse: Promise[JsValue]
이제 세 번째 함수(def getAll: Promise[JsValue]
) 전화하는 것 getSomething
그런 다음 응답에 따라 응답을 반환하거나 getSomethingElse
원본에 응답을 추가합니다.
나는 현재 getAll
다음과 같이 정의됩니다:
def getAll: Promise[JsValue] = {
getSomething flatMap { response:JsValue =>
(response \ "someAttribute").asOpt[String] match {
case None =>
val resultPromise = Promise[JsValue]
resultPromise.redeem(response)
resultPromise
case Some(someAttribute) => getSomethingElse map { moreResponse:JsValue =>
response ++ moreResponse
}
}
}
}
이것은 작동하지만 더 표준적인 스칼라와 동일한 작업을 수행하는 더 짧은 방법이 있는지 궁금하십니까?
해결책
Derek Williams로부터 답변을 받았습니다. Play Frameworks Google 그룹의 교차 게시물.
내가 보기에 이상적이지 않은 유일한 것은 Option의 패턴 일치입니다. 대신 map/getOrElse를 사용하면 좀 더 자유롭게 구성할 수 있습니다.또한 어떤 값을 사용하지 않으려면 이름을 지정하지 않고 대신 _를 사용하는 것이 가장 좋습니다.
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}
제휴하지 않습니다 StackOverflow