A 또는 Promise[A]가 주어지면 단일 Promise[A]를 어떻게 반환할 수 있나요?

StackOverflow https://stackoverflow.com//questions/12699929

문제

예상대로 작동하는 두 가지 기능이 있습니다

  1. def getSomething: Promise[JsValue]
  2. 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
    }
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top