Как я могу вернуть одно обещание[A] с учетом A или Promise[A]?
-
12-12-2019 - |
Вопрос
У меня есть две функции, которые работают должным образом
def getSomething: Promise[JsValue]
def getSomethingElse: Promise[JsValue]
Теперь я хочу определить третью функцию (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?
Решение
Получил ответ от Дерека Уильямса на перекрестная публикация в группе Google Play Frameworks.
Единственное, что я вижу там, что не идеально, это сопоставление с образцом в Option, вместо этого использование map/getOrElse дает вам немного больше свободы для лучшего сочинения.Кроме того, если вы не собираетесь использовать какое-либо значение, лучше не давать ему имя, а вместо этого использовать _
def getAll: Promise[JsValue] = {
getSomething flatMap { response =>
(response \ "someAttribute").asOpt[String] map { _ =>
getSomethingElse map (response ++ _)
} getOrElse {
Promise pure response
}
}
}