복붙노트

[SCALA] 어떻게 실패에도 불구하고 미래의 순서를 실행을 계속합니다?

SCALA

어떻게 실패에도 불구하고 미래의 순서를 실행을 계속합니다?

미래 개체에서의 이송 방법은 첫번째 고장에 멈춘다. 나는 오류의 발생에 시퀀스의 나머지 부분을 수행하는 경우이 방법의 허용 / 용서 버전을합니다.

현재 우리는 다음과 같은 방법을 우리의 유틸에 추가 한 :

def traverseFilteringErrors[A, B <: AnyRef]
                           (seq: Seq[A])
                           (f: A => Future[B]): Future[Seq[B]] = {
  val sentinelValue = null.asInstanceOf[B]
  val allResults = Future.traverse(seq) { x =>
    f(x) recover { case _ => sentinelValue }
  }
  val successfulResults = allResults map { result =>
    result.filterNot(_ == sentinelValue)
  }
  successfulResults
}

이 작업을 수행하는 더 좋은 방법이 있나요?

해결법

  1. ==============================

    1.(일반적으로) 진정으로 유용한 것은 적절한 값으로 미래의 오류를 촉진 할 수있을 것이다. 아니면 즉, 미래로 미래 [T]를 변환 [시도 [T]]합니다 (성공적인 반환 값은 성공 [T] 실패 케이스가 실패하게하면서 [T]가된다)를. 여기에 우리가 그것을 구현하는 방법입니다 :

    (일반적으로) 진정으로 유용한 것은 적절한 값으로 미래의 오류를 촉진 할 수있을 것이다. 아니면 즉, 미래로 미래 [T]를 변환 [시도 [T]]합니다 (성공적인 반환 값은 성공 [T] 실패 케이스가 실패하게하면서 [T]가된다)를. 여기에 우리가 그것을 구현하는 방법입니다 :

    // Can also be done more concisely (but less efficiently) as:
    // f.map(Success(_)).recover{ case t: Throwable => Failure( t ) }
    // NOTE: you might also want to move this into an enrichment class
    def mapValue[T]( f: Future[T] ): Future[Try[T]] = {
      val prom = Promise[Try[T]]()
      f onComplete prom.success
      prom.future
    }
    

    이제, 당신은 다음을 수행하는 경우 :

    Future.traverse(seq)( f andThen mapValue )
    

    각 실패 미래를위한 성공적인 미래, 그 최종 값이 각각의 성공적인 미래를위한 성공의 인스턴스를 포함 [서열 [시도 [A]]], 및 실패 인스턴스를 얻을 수 있습니다. 필요한 경우, 당신은 다음 실패 인스턴스를 드롭 만 사점 값을 유지하기 위해 서열에 수집 할 수 있습니다.

    다음과 같이 즉, 당신은 당신의 도우미 메서드를 다시 작성할 수 있습니다 :

    def traverseFilteringErrors[A, B](seq: Seq[A])(f: A => Future[B]): Future[Seq[B]] = {
      Future.traverse( seq )( f andThen mapValue ) map ( _ collect{ case Success( x ) => x } )
    }
    
  2. from https://stackoverflow.com/questions/15775824/how-to-carry-on-executing-future-sequence-despite-failure by cc-by-sa and MIT license