나는 스칼라로 작성된 액터 기반 응용 프로그램 (akka 사용)을 가지고 있습니다. 이제는 네트워크에서 다양한 HTTP 요청을 미리 정의 된 순서로 전송하여 장치를 구성해야하는 액터가 있습니다.동작 시퀀스 깨끗한 코드
액터가 액세스 할 수 있도록 별도의 클래스에 모든 HTTP 항목을 캡슐화했습니다. 각 구성 단계는 물론 실패 할 수 있으므로 Try[Int]
을 장치와의 통신을 처리하는 메서드의 반환 유형으로 사용했습니다 (HTTP-responecode를 Try
의 내용으로 반환).
내 문제는 모든 구성 단계가 성공적으로 완료되기 전에 모든 단계에 따라 다르므로 내 코드를 읽기가 어려워진다는 점입니다.
는 나는이 그냥 무슨 일이 일어나고 있는지 먼저 눈에 볼 수 cannont 거대한 문이되는 몇 가지 작업을 한 후이
action1 match {
case Failure(err) => //report error
case Success(retCode) if retCode < 400 =>
nextStep match {
...
}
}
처럼 기본적으로 구현했습니다.
이렇게 코드를 작성하는 방법은 무엇입니까? 당신이 Try
대신 Future
를 사용해야 버전을 비 차단
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
}
:
차단 버전 :
Ahh right'find'는'true'가 있으면 실행을 멈 춥니 다. 뒤늦게 볼 때 이것은 좀 명백한 해결책이었습니다 ^^ – mgttlinger
이 액터의 전체 목적이이 액션들을 실행하는 것이기에 여기에서 차단하면 어쨌든 서로 기다려야 만합니다. – mgttlinger
@mgttlinger : 저는하지 않습니다. 어떻게'HTTP' 응답을 얻는 지 알지만, 라이브러리가'Future [Response]'를 제공한다면'Await'을 사용하여'Try'로 변환해서는 안됩니다. – senia