我想要一个接一个地执行2个网络调用。这两个网络调用都返回Observable。第二次呼叫使用来自第一次呼叫成功结果的数据,第二次呼叫成功结果的方法使用来自的数据,第一次和第二次呼叫的成功结果均为。另外,我应该能够以不同方式处理两个 onError“事件”。我怎样才能做到这一点,避免回调地狱像下面的例子中:连锁两个改造的可观察性w/RxJava
API().auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<AuthResponse>() {
@Override
public void call(final AuthResponse authResponse) {
API().getUser(authResponse.getAccessToken())
.subscribe(new Action1<List<User>>() {
@Override
public void call(List<User> users) {
doSomething(authResponse, users);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorGetUser();
}
});
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorAuth();
}
});
我知道的拉链,但我想避免打造“合班”。
更新1 试图执行akarnokd的回答是:
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(authResponse -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> {
getView().setError(processFail(throwable));
}), ((authResponse, users) -> {
// Ensure returned user is the which was authenticated
if (authResponse.getUserId().equals(users.get(0).getId())) {
SessionManager.getInstance().initSession(email, password, authResponse.getAccessToken(), users.get(0));
getView().toNews();
} else {
getView().setError(R.string.something_went_wrong);
}
}));
但是里面flatMap
方法编译器说,它无法解析authResponse和用户(authResponse.getAccessToken()
,users.get(0)
等)的方法。我是新的rx编程和lambda - 请告诉我有什么问题。无论如何,代码看起来更清洁。
更新2
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> getView().setError(processFail(throwable)))
.flatMap((AuthResponse authResponse) -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> getView().setError(processFail(throwable))), ((AuthResponse authResponse, List<User> users) -> {
// Ensure returned user is the which was authenticated
if (authResponse.getUserId().equals(users.get(0).getId())) {
SessionManager.getInstance().initSession(email, password, authResponse.getAccessToken(), users.get(0));
getView().toNews();
}
return Observable.just(this);
}));
都做到了这样,但现在我的网络电话无法执行的。
我从IDE了,但我认为错误是由于拉姆达参数名称冲突。 – akarnokd
看起来你不再订阅了。确保你在链的底部调用.subscribe()。 –