Comment puis-je retourner une Promesse unique[A] donné Une Promesse ou[A]?
-
12-12-2019 - |
Question
J'ai deux fonctions qui fonctionnent comme prévu
def getSomething: Promise[JsValue]
def getSomethingElse: Promise[JsValue]
Maintenant, je veux définir une troisième fonction (def getAll: Promise[JsValue]
) qui appelle getSomething
et puis, sur la base de la réponse soit de renvoyer la réponse ou getSomethingElse
et d'ajouter sa réponse à l'original.
J'ai actuellement getAll
définis comme suit:
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
}
}
}
}
Cela fonctionne, mais je me demandais si il y avait un moyen plus court de faire la même chose qui a été plus canonique scala?
La solution
Eu une réponse de Derek Williams sur le cross post sur le Jeu de Cadres du Groupe Google.
La seule chose que je vois qui n'est pas idéal, c'est un patron sur Option, au lieu d'utiliser la carte/getOrElse vous donne un peu plus de liberté pour composer la meilleure.Aussi, si vous n'allez pas utiliser une certaine valeur, il est préférable de ne pas lui donner un nom et à la place utiliser _
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}