我有3个api调用,要求是
使用下面的代码,根本不会重试第一个api
public static void main(String[] args) {
Single.zip(
getA().retry(3),
getB().onErrorResumeNext(Single.just("defaultB")),
getC(),
(a, b, c) -> a)
.subscribe(a -> {
System.out.println(a);
}, error -> {
System.out.println(error.getMessage());
});
}
private static Single<String> getA() {
System.out.println("getA()");
return Single.error(new Exception("a"));
}
private static Single<String> getB() {
System.out.println("getB()");
return Single.error(new Exception("b"));
}
private static Single<String> getC() {
System.out.println("getB()");
return Single.error(new Exception("b"));
}
答案 0 :(得分:1)
我很确定Single
被重试,但是对getA()
的调用没有,因为它不属于RxJava链。您只需调用一次,因此打印输出仅发生一次。
要完整重试该方法,请将方法的内容包装到defer
中:
private static Single<String> getA() {
return Single.defer(() -> {
System.out.println("getA()");
return Single.error(new Exception("a"));
});
}
如果您的要求同时说A和B + C,那么以下顺序更合适:
getA().retry(3)
.flatMap(a -> Single.zip(
getB().onErrorResumeNext(Single.just("defaultB")),
getC(),
(b, c) -> a
))
.subscribe(a -> {
System.out.println(a);
}, error -> {
System.out.println(error.getMessage());
});
答案 1 :(得分:0)
如果您的呼叫是从属的,则邮编不正确,该怎么办?
Single.just("input")
.flatMap(a -> getA()).retry(3)
.flatMap(a -> getB()).onErrorResumeNext(Single.just("defaultB"))
.flatMap(b -> getC())
.subscribe(a -> {
System.out.println(a);
}, error -> {
System.err.println(error.getMessage());
});