我有两个可观察对象(简称为A和B)和一个用户 . 因此,订阅者订阅A,如果A上有错误,那么B(这是后备)就会启动 . 现在,每当A遇到错误B被称为罚款,但是A调用订阅者的onComplete(),所以B响应即使B执行成功,也永远不会到达订户 .
这是正常行为吗?我认为onErrorResumeNext()应该继续流并在完成后通知订阅者,如文档(https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators#onerrorresumenext)中所述 .
这是我正在做的整体结构(省略了几个“无聊的”代码):
public Observable<ModelA> observeGetAPI(){
return retrofitAPI.getObservableAPI1()
.flatMap(observableApi1Response -> {
ModelA model = new ModelA();
model.setApi1Response(observableApi1Response);
return retrofitAPI.getObservableAPI2()
.map(observableApi2Response -> {
// Blah blah blah...
return model;
})
.onErrorResumeNext(observeGetAPIFallback(model))
.subscribeOn(Schedulers.newThread())
})
.onErrorReturn(throwable -> {
// Blah blah blah...
return model;
})
.subscribeOn(Schedulers.newThread());
}
private Observable<ModelA> observeGetAPIFallback(ModelA model){
return retrofitAPI.getObservableAPI3().map(observableApi3Response -> {
// Blah blah blah...
return model;
}).onErrorReturn(throwable -> {
// Blah blah blah...
return model;
})
.subscribeOn(Schedulers.immediate());
}
Subscription subscription;
subscription = observeGetAPI.subscribe(ModelA -> {
// IF THERE'S AN ERROR WE NEVER GET B RESPONSE HERE...
}, throwable ->{
// WE NEVER GET HERE... onErrorResumeNext()
},
() -> { // IN CASE OF AN ERROR WE GET STRAIGHT HERE, MEANWHILE, B GETS EXECUTED }
);
我有什么想法我做错了吗?
谢谢!
EDIT: 这里's a rough timeline of what'发生了:
---> HTTP GET REQUEST B
<--- HTTP 200 REQUEST B RESPONSE (SUCCESS)
---> HTTP GET REQUEST A
<--- HTTP 200 REQUEST A RESPONSE (FAILURE!)
---> HTTP GET FALLBACK A
** onComplete() called! ---> Subscriber never gets fallback response since onComplete() gets called before time.
<--- HTTP 200 FALLBACK A RESPONSE (SUCCESS)
在这里's a link to a simple diagram I made which represent'我想要发生的事情:Diagram
1 回答
以下使用的Rx调用应模拟您使用Retrofit进行的操作 .
日志语句的输出是:
这看起来像你在寻找,但也许我错过了一些东西 .