Цепочка двух модифицированных наблюдаемых с RxJava

Я хочу выполнить 2 сетевых вызова один за другим. Оба сетевых вызова возвращают наблюдаемый. Второй вызов использует данные из успешного результата первого вызова, метод в успешном результате второго вызова использует данные изи то и другое успешный результат первого и второго звонка. Также я должен быть в состоянии справитьсяи то и другое onError "события" по-разному. Как я могу добиться этого, избегая ада обратного вызова, как в примере ниже:

       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();
                }
            });

Я знаю про zip, но хочуизбежать создание "Combiner class".

Обновление 1. Пытался реализовать ответ Акарнокда:

         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 и Lambdas - пожалуйста, скажите мне, в чем проблема. В любом случае код теперь выглядит намного чище.

Обновление 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);
            }));

Сделали это так, но теперь мои сетевые вызовы не выполняются вообще.

Ответы на вопрос(2)

Ваш ответ на вопрос