如何给出A或Promise [A]的单一承诺[A]?

时间:2012-10-02 23:29:18

标签: scala playframework-2.0 promise

我有两个按预期工作的功能

  1. def getSomething: Promise[JsValue]
  2. def getSomethingElse: Promise[JsValue]
  3. 现在我想定义一个调用def getAll: Promise[JsValue]的第三个函数(getSomething),然后根据响应返回响应或getSomethingElse并将其响应附加到原始函数。 / p>

    我目前的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?

1 个答案:

答案 0 :(得分:1)

得到了德里克·威廉姆斯对cross post on Play Frameworks Google Group的答复。

  

我在那里看到的唯一不理想的是Option上的模式匹配,而使用map / getOrElse可以让你更自由地组合更好。此外,如果您不打算使用某些值,最好不要给它命名,而是使用_

def getAll: Promise[JsValue] = {
  getSomething flatMap { response =>
    (response \ "someAttribute").asOpt[String] map { _ =>
      getSomethingElse map (response ++ _)
    } getOrElse {
      Promise pure response
    }
  }
}