0
이 작업이 성공할 때까지 (즉, true
을 반환 할 때까지) 코드에서 특정 비동기 작업을 반복하고 싶습니다. 그것은 잘 작동이 같은 출력한다RxJava에서 루프 상태가 참이 될 때
Supplier<Observable<Boolean>> myOperation =() -> {
// do something useful and return 'true' if it was successful
// NOTE: GENERATING A RANDOM NUMBER IS JUST AN EXAMPLE HERE
// I WANT TO RUN AN ASYNCHRONOUS OPERATION (LIKE PINGING A SERVER
// OR THE LIKE) AND RETRY IT UNTIL IT SUCCEEDS.
System.out.println("Try");
return Observable.just(Math.random() > 0.9);
};
final Throwable retry = new IllegalStateException();
Observable.<Boolean>create(subscriber -> {
myOperation.get().subscribe(subscriber);
}).flatMap(b -> b ? Observable.just(b) : Observable.error(retry))
.retryWhen(exceptions -> exceptions.flatMap(exception -> {
if (exception == retry) {
return Observable.timer(1, TimeUnit.SECONDS);
}
return Observable.error(exception);
}))
.toBlocking()
.forEach(b -> {
System.out.println("Connected.");
});
:
나는 다음과 같은 해결 방법을 사용하고 순간내가 원하는 코드는 않습니다
Try
Try
...
Try
Connected.
무엇을하지만, '아무튼 매우 우아한 봐. 더 좋은 방법이 있어야합니다. 어쩌면 주문 Operator
을 사용하여?
누구나 RxJava에서 동일한 것을 달성하는 방법을 알고 있지만 더 읽기 쉬운 방식으로 인공물이 없으면 Throwable
이 없습니까?
감사합니다. 솔루션을 제 문제에 매핑하는 데 문제가 있습니다. 성공할 때까지 비동기 작업을 다시 시도하고 싶습니다. 난수 생성은 여기에 그 예가 있습니다. –
다른 접근 방식으로 댓글을 수정했습니다. –