Wie kann ich ein einzelnes Versprechen [A] zurückgeben, wenn A oder Versprechen [A] gegeben ist?

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

Frage

Ich habe zwei Funktionen, die wie erwartet funktionieren

  1. def getSomething: Promise[JsValue]
  2. 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?

War es hilfreich?

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
    }
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top