我想要一個接一個地執行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()。 –