我有一个基于actor的应用程序(使用akka)用scala编写。现在我有一个演员应该通过以预定义的顺序发送各种HTTP请求来配置网络中的设备。
我将所有HTTP内容封装在一个单独的类中供我的actor访问。
每个配置步骤当然都会失败,所以我使用Try[Int]
作为处理与设备通信的方法的返回类型(将HTTP响应代码作为Try
的内容返回)。 p>
现在我的问题是,每个配置步骤都依赖于成功完成之前的所有步骤,因此我的代码变得难以阅读(在我的意见中)。
我基本上已经实现了这个
action1 match {
case Failure(err) => //report error
case Success(retCode) if retCode < 400 =>
nextStep match {
...
}
}
经过几次行动之后,这只是一个巨大的陈述,乍一看你看不出发生了什么。
那么我将如何以干净利落的方式撰写本文呢?
答案 0 :(得分:1)
您可以将您的操作序列实现为......操作序列:
阻止版本:
def seq: Seq[() => Try[Int]] = ???
// find first failure
def failed: Option[Try[Int]] = seq.view.map{ _() }.find {
case Failure(err) =>
//report error
true
case Success(retCode) => retCode > 400
}
对于非阻止版本,您应使用Future
代替Try
:
val seq: List[() => Future[Int]] = ???
def isSuccess(actions: List[() => Future[Int]]): Future[Boolean] = actions match {
case h :: tail => h().flatMap { c =>
if (c > 400) Future(false)
else isSuccess(tail)
}
case Nil => Future(true)
}