2

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

  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 相同的事情?

4

1 回答 1

1

在 Play Frameworks Google Group的交叉帖子中得到了 Derek Williams 的回复。

我在那里看到的唯一不理想的是 Option 上的模式匹配,而不是使用 map/getOrElse 为您提供了更多自由来更好地编写。此外,如果您不打算使用某些值,最好不要给它命名,而是使用 _

def getAll: Promise[JsValue] = {
  getSomething flatMap { response =>
    (response \ "someAttribute").asOpt[String] map { _ =>
      getSomethingElse map (response ++ _)
    } getOrElse {
      Promise pure response
    }
  }
}
于 2012-10-03T00:43:28.537 回答