¿Cómo puedo devolver una sola Promesa[A] dada A o Promesa[A]?
-
12-12-2019 - |
Pregunta
Tengo dos funciones que funcionan como se esperaba.
def getSomething: Promise[JsValue]
def getSomethingElse: Promise[JsValue]
Ahora quiero definir una tercera función (def getAll: Promise[JsValue]
) que llama getSomething
y luego, según la respuesta, devolver la respuesta o getSomethingElse
y adjuntar su respuesta al original.
actualmente tengo getAll
definido de la siguiente manera:
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
}
}
}
}
Esto funciona, pero me preguntaba si había una forma más corta de lograr lo mismo que fuera más canónica en Scala.
Solución
Recibí una respuesta de Derek Williams en el publicación cruzada en Play Frameworks Google Group.
Lo único que veo allí que no es ideal es la coincidencia de patrones en Option; en cambio, usar map/getOrElse te da un poco más de libertad para componer mejor.Además, si no vas a utilizar algún valor, es mejor no darle nombre y en su lugar utilizar _
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}