Wie kann ich ein einzelnes Versprechen [A] zurückgeben, wenn A oder Versprechen [A] gegeben ist?
-
12-12-2019 - |
Frage
Ich habe zwei Funktionen, die wie erwartet funktionieren
def getSomething: Promise[JsValue]
def getSomethingElse: Promise[JsValue]
Jetzt möchte ich eine dritte Funktion definieren (def getAll: Promise[JsValue]
) das ruft getSomething
und dann basierend auf der Antwort entweder die Antwort zurückgeben oder getSomethingElse
und fügen Sie seine Antwort an das Original an.
Ich habe derzeit getAll
wie folgt definiert:
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
}
}
}
}
Das funktioniert, aber ich habe mich gefragt, ob es einen kürzeren Weg gibt, um dasselbe zu erreichen, was kanonischer Scala war?
Lösung
Habe eine Antwort von Derek Williams auf die crosspost auf Play Frameworks Google-Gruppe.
Das einzige, was ich dort sehe, das nicht ideal ist, ist der Mustervergleich bei Option, stattdessen gibt Ihnen die Verwendung von map / getOrElse etwas mehr Freiheit, besser zu komponieren.Wenn Sie keinen Wert verwenden, ist es am besten, ihm keinen Namen zu geben und stattdessen zu verwenden _
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}