Throttling

정해진 시간동안 발생된 걸 무시를 할 수 있는 함수이다.

  • ThrottleLast() : 정해진 시간안에 마지막 내용만 리턴한다.
  • ThrottleFirst() : 정해진 시간안에 처음 내용만 리턴한다.
  • ThrottleWithTimeout() : debuoune 와 유사하며 일정시간동안 모든 아이템은 무시한다.

우선 일반적인 형태를 보자.

Observable<String> source1 = Observable.interval(100 , TimeUnit.MILLISECONDS)
        .map(i-> (i+1) * 100)
        .map(i-> "Source 1 " + i)
        .take(10);

Observable<String> source2 = Observable.interval(300 , TimeUnit.MILLISECONDS)
        .map(i-> (i+1) * 300)
        .map(i-> "Source 2 " + i)
        .take(3);

Observable<String> source3 = Observable.interval(2000 , TimeUnit.MILLISECONDS)
        .map(i-> (i+1) * 2000)
        .map(i-> "Source 3 " + i)
        .take(2);

//concat 으로 순서대로 진행시킨다. 
Observable.concat(Arrays.asList( source1 , source2 , source3))
        .subscribe( System.out::println);

sleep
(6000);
............
Source 1 100
Source 1 200
Source 1 300
Source 1 400
Source 1 500
Source 1 600
Source 1 700
Source 1 800
Source 1 900
Source 1 1000
Source 2 300
Source 2 600
Source 2 900
Source 3 2000
Source 3 4000

throttleLast()

마지막 아이템만 리턴한다. ( sample() 이라고 불린다.)

Observable.concat(Arrays.asList( source1 , source2 , source3))
    .throttleLast( 1, TimeUnit.SECONDS)
    .subscribe( System.out::println);

........
Source 1 900 <- 1초안에서 제일 마지막 아이템만 리턴합니다. 
Source 2 900 <- 상동
Source 3 2000 <- 1초 안에 없다면 효과적으로 최신껄 끌어내는 걸 볼수 있다.

그럼 시간을 좀 더 늘릴 경우는 방출되는 아이템이 더 작아지는 걸 볼수 있다.

.throttleLast( 2, TimeUnit.SECONDS)

.........
Source 2 900
Source 3 2000

throttleFirst()

일정시간안에 최초 방출 아이템만 리턴한다.

Observable.concat(source1, source2, source3)
         .throttleFirst(1, TimeUnit.SECONDS)
         .subscribe(System.out::println);
........
SOURCE 1: 100
SOURCE 2: 300
SOURCE 3: 2000 <-- 1초안에 최초 아이템 리턴
SOURCE 3: 4000 <-- 다시 1초안에 최초 아이템 리턴

ThrottleWithTimeout() < debound() >

일정 시간에 있는 모든 아이템을 무시한다.

.throttleWithTimeout(1, TimeUnit.SECONDS)
..........
SOURCE 2: 900
SOURCE 3: 2000
SOURCE 3: 4000


+ Recent posts