我有一个游戏框架作用,这需要完成顺序3件事情实用的风格: -这种多任务操作
- 得到两个参数(A,B)的要求
- 如果两个PARAMS存在,那么用A来从缓存中获取
- 如果条目缓存中存在的条目,然后
我有什么到目前为止调用Web服务与B: -
// async since we are calling Async APIs like WS
def myAction = Action.async { implicit request =>
val A = requestParam(request, "a") // Option[String]
val B = requestParam(request, "b")
val futureResponse = for {
token <- getFromCache(A) recoverWith {
case e: Exception => Future.failed(new Exception("Some issue with param or cache", e))
}
wsResponse <- webServiceCall(B) recoverWith {
case e: Exception => Future.failed(new Exception("Some issue with web service call", e))
}
} yield Ok(wsResponse.body)
futureResponse recover {
case e: Exception => Ok(failureBody(e.getMessage))
}
}
我明显地忽略了一些对我的问题并不重要的简洁的细节。
我的问题是(作为斯卡拉新手)什么将是一个很好的功能方式来完成此操作。如果参数不存在,那么我不想执行for
的理解,但返回一个包含错误消息的Future[Result]
。目前我能想到的唯一方法是使用下面的if
测试,但我不禁怀疑可能会有一种更为简单的方法来实现这一点。
val A = requestParam(request, "a") // Option[String]
val B = requestParam(request, "b")
if(A.isEmpty || B.isEmpty) {
Future { Ok("Params missing") }
} else {
val futureResponse = for {
token <- getFromCache(A) recoverWith {
case e: Exception => Future.failed(new Exception("Some issue with param or cache", e))
}
wsResponse <- webServiceCall(B) recoverWith {
case e: Exception => Future.failed(new Exception("Some issue with web service call", e))
}
} yield Ok(wsResponse.body)
futureResponse recover {
case e: Exception => Ok(failureBody(e.getMessage))
}
}
我非常感谢任何有关人们如何更优雅地接近我的上述解决方案的意见。
迈克,非常感谢您抽出宝贵的细节做出响应的时间。几个很好的选择让我去工作。 ;) – JamieP