2016-06-29 3 views
0

Observer의 onNext 메서드에서 소스 observable을 종료하는 가장 좋은 방법은 무엇일까?Observer의 onNext 메서드에서 소스 observable을 종료하는 방법

예를 들어, 유효성 검사가 정상적으로 완료되면 버튼 이벤트가 한 번만 발생하기를 원합니다. 그러나 유효성 검사가 실패하면 버튼 이벤트가 다시 발생할 수 있습니다.

제가 생각할 수있는 것은 아래에 있습니다.

Observable.... 
    .subscribe(new Subscriber(){ 
     public void onNext(T t){ 
      // do something and terminate the Observable 
      // only when the validate method return true 
      if (validate(t)){ 
       doSomething(t); 
       unsubscribe(); 
      } 
     } 
     ... 
    }); 

그러나 onCompleted 이벤트가 필요한 경우 작동하지 않습니다. onNext()

은 또한, 나는 관찰자가 검증의 책임을해야하기 때문에 관찰 가능한이 안 좋은 생각이 될 것으로 그 유효성을 가지고 생각 관찰자의 은 또한, 나는에서 onCompleted()를 호출 확실하지 않다. 또한, "Hot"Observable의 경우, 관찰자에게 관찰자가있는 경우 유효성 검사가 각 Observer와 다를 수 있습니다.

답변

2

당신은 이들 종류의 경우에 대한 takeUntil 또는 takeWhile 같은 연산자를 사용할 수 있습니다

Observable.... 
    .takeUntil(t -> validate(t)) 
    .subscribe(t -> doSomething(t)); 

힌트를 일반적으로 :API documentation를 참조하십시오. 대부분의 답변은 이미 사용 가능합니다. 또한 일부 상황에서는 대리석 다이어그램을 직접 그린 다음 참조 된 페이지의 그림과 비교할 때 도움이됩니다. 마지막으로 특정 운영자의 경우 a more interactive experience을 사용할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 사업자를 알고 있었지만 나는이 아이디어를 얻을 수 없었다. 관찰 대상의 소스는 하나의 객체 였기 때문에 각 관찰자의 다양한 유효성 검사를 처리하기 위해 하나의 관찰 가능 객체를 사용하도록했습니다. 그러나,이 경우, 나는 관찰 대상을 만들 수 있습니다. Rx 사용의 가장 어려운 부분은 유연하게 생각하는 것일 수도 있습니다. 다시 한번 고마워요 !! – otal

관련 문제