2017-03-18 1 views
1

차단 방법이 List<UUID> listOf(int page)이라고 가정 해 봅시다. 나는 이런 식으로 뭔가를 페이지를 매기려면 , 하나 개의 아이디어는 이런 일을하는 것입니다 :연결 방법 앞 페이지에서 Observable의 정보를 사용하여

public Observable<UUID> allOf(int initialPage) { 
    return fromCallable(() -> listOf(initialPage)) 
      .concatWith(fromCallable(() -> allOf(initialPage + 1))) 
      .flatMap(x -> from(x)); 
} 

내 서비스는 다음 요소를 찾기 위해 페이지 번호 만리스트의 마지막 요소를 사용하지 않는 경우, 어떻게 할 수 나는 RxJava으로 그것을 달성합니까?

allOf(0).take(20) 같은 효과를 얻고 concatWith으로 첫 번째 관찰이 완료되었을 때 두 번째 Observable 호출을 얻고 싶습니다.

하지만 이전 호출에서 정보가 필요할 때 어떻게해야합니까?

답변

1

당신은 시퀀스의 시작 부분에 다음 페이지 번호를 다시 보낼 대상을 사용할 수

List<Integer> service(int index) { 
    System.out.println("Reading " + index); 
    List<Integer> list = new ArrayList<>(); 
    for (int i = index; i < index + 20; i++) { 
     list.add(i); 
    } 
    return list; 
} 

Flowable<List<Integer>> getPage(int index) { 
    FlowableProcessor<Integer> pager = UnicastProcessor.<Integer>create() 
     .toSerialized(); 
    pager.onNext(index); 

    return pager.observeOn(Schedulers.trampoline(), true, 1) 
    .map(v -> { 
     List<Integer> list = service(v); 
     pager.onNext(list.get(list.size() - 1) + 1); 
     return list; 
    }) 
    ; 
} 

@Test 
public void testPager() { 
    getPage(0).take(20) 
    .subscribe(System.out::println, Throwable::printStackTrace); 
} 
+0

왜 트램 폴린을? – dierre

+0

재귀 onNext 호출을 방지합니다. – akarnokd