A または Promise[A] を指定して単一の Promise[A] を返すにはどうすればよいですか?
-
12-12-2019 - |
質問
期待どおりに動作する関数が 2 つあります
def getSomething: Promise[JsValue]
def getSomethingElse: Promise[JsValue]
ここで 3 番目の関数を定義したいと思います (def getAll: Promise[JsValue]
) を呼び出す getSomething
そして、応答に基づいて応答を返すか、 getSomethingElse
そしてその応答を元のメッセージに追加します。
私は現在持っています getAll
次のように定義されます。
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
}
}
}
}
これは機能しますが、同じことをより標準的な scala で達成するためのより短い方法があるのではないかと疑問に思っていませんか?
解決
デレク・ウィリアムズから返事が来た Play Framework Google グループでのクロスポスト.
理想的ではないと思われる唯一の点は、Option でのパターン マッチングです。代わりに、map/getOrElse を使用すると、より自由に構成できるようになります。また、値を使用しない場合は、名前を付けず、代わりに _ を使用することをお勧めします。
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}
所属していません StackOverflow