Como posso retornar uma única Promise[A] dada A ou Promise[A]?
-
12-12-2019 - |
Pergunta
Tenho duas funções que estão funcionando conforme o esperado
def getSomething: Promise[JsValue]
def getSomethingElse: Promise[JsValue]
Agora quero definir uma terceira função (def getAll: Promise[JsValue]
) que chama getSomething
e então com base na resposta retorne a resposta ou getSomethingElse
e anexe sua resposta ao original.
Atualmente tenho getAll
definido da seguinte forma:
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
}
}
}
}
Isso funciona, mas queria saber se havia uma maneira mais curta de realizar a mesma coisa que fosse um scala mais canônico?
Solução
Recebi uma resposta de Derek Williams no postagem cruzada no Play Frameworks Google Group.
A única coisa que vejo lá que não é ideal é a correspondência de padrões em Option; em vez disso, usar map/getOrElse oferece um pouco mais de liberdade para compor melhor.Além disso, se você não for usar algum valor, é melhor não dar um nome a ele e usar _
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}