2013-12-18 4 views
1

나는 스칼라로 작성된 액터 기반 응용 프로그램 ( 사용)을 가지고 있습니다. 이제는 네트워크에서 다양한 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 
    } 

:

차단 버전 :

답변

1

당신은 ... 작업 순서 작업 시퀀스를 구현할 수

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) 
} 
+0

Ahh right'find'는'true'가 있으면 실행을 멈 춥니 다. 뒤늦게 볼 때 이것은 좀 명백한 해결책이었습니다 ^^ – mgttlinger

+0

이 액터의 전체 목적이이 액션들을 실행하는 것이기에 여기에서 차단하면 어쨌든 서로 기다려야 만합니다. – mgttlinger

+0

@mgttlinger : 저는하지 않습니다. 어떻게'HTTP' 응답을 얻는 지 알지만, 라이브러리가'Future [Response]'를 제공한다면'Await'을 사용하여'Try'로 변환해서는 안됩니다. – senia

관련 문제