首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RxJava retryWhen重试返回可完成的整个方法

RxJava retryWhen重试返回可完成的整个方法
EN

Stack Overflow用户
提问于 2019-11-22 10:15:43
回答 1查看 644关注 0票数 0

每次API用无效的令牌错误(重新身份验证)响应时,我都试图重新验证令牌。我有一个小例子,它复制了我所面临的问题。基本上,第一个调用将抛出一个异常,这将触发重试,当它重试时,auth方法不会再次被完全调用(它不打印“”,而是打印“authing.”)。

代码语言:javascript
运行
复制
public class Example {

AtomicInteger atom = new AtomicInteger(1);

public Example(){}

public void start(){
    auth().andThen(call())
            .retryWhen(throwableFlowable -> throwableFlowable.flatMap(throwable -> {
                System.out.println("Retrying...\n");
                return Flowable.timer(1, TimeUnit.SECONDS);
            }))
            .subscribe(integer -> System.out.println("Result: " + integer), e -> System.out.println("Error" + e.getMessage()));
}

public Completable auth(){
    System.out.println("Entered Auth");
    return Completable.create(emitter -> {
        System.out.println("authing...");
        emitter.onComplete();
    });
}

public Single<String> call(){
    return getId()
            .flatMap(this::getNameById);
}

public Single<Integer> getId(){
    return Single.create(emitter -> {
        emitter.onSuccess(atom.getAndIncrement());
    });
}

public Single<String> getNameById(int id){
    return Single.create(emitter -> {
        HashMap<Integer, String> hash = new HashMap<>();
        hash.put(1, "s");
        hash.put(2, "b");
        if(id == 1){
            emitter.onError(new Throwable());
        }else{
            emitter.onSuccess(hash.get(id));
        }
    });
}

}

同样,这是我的输出:

代码语言:javascript
运行
复制
Entered Auth
authing...
Retrying...

authing...
Result: b

如何强制整个auth()方法在重试上运行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-22 10:47:02

使用Completable.defer,它将包装您的可完成的创建,并在重试时重做,而不只是重新订阅。

代码语言:javascript
运行
复制
 Completable.defer(() -> auth()).andThen(call())
                .retryWhen(throwableFlowable -> throwableFlowable.flatMap(throwable -> {
                    System.out.println("Retrying...\n");
                    return Flowable.timer(1, TimeUnit.SECONDS);
                }))
                .subscribe(integer -> System.out.println("Result: " + integer), e -> System.out.println("Error" + e.getMessage()));

输出:

代码语言:javascript
运行
复制
Entered Auth
authing...
Retrying...

Entered Auth
authing...
Result: b
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58992043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档