Как я могу вернуть одно обещание[A] с учетом A или Promise[A]?

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

Вопрос

У меня есть две функции, которые работают должным образом

  1. def getSomething: Promise[JsValue]
  2. 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
    }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top