2017-07-07 50 views
0

我是RxJava的新手。我有一个场景,我想调用第一个登录web服务(getLoginObservable),如果成功,想调用另一个webservice(getFetchDataObservable)来获取用户信息。RxAndroid接连拨打一个网络电话

如果登录成功,我有以下代码工作。但我无法弄清楚如何编码failure的情况。

private void doLogin() { 
    emailAddress = editTextUsername.getText().toString(); 
    final String password = editTextPassword.getText().toString(); 
    showProgress(null, getString(R.string.loggingInPleaseWait)); 

    getLoginObservable(editTextUsername.getText().toString(), password) 
      .map(response -> { 
       if (response.result) { 
        getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question); 
       } 
       return response; 
      }) 
      .flatMap(response -> { 
       return getFetchDataObservable(); 
      }) 
      .subscribe(res -> { 
       dismissProgress(); 
       if (res.result) { 
        saveInformation(password, res); 
       } else { 
        ConstantsMethods.showOkButtonDialog(getContext(), res.message, null); 
       } 
      }, e -> { 
       dismissProgress(); 
       if (e instanceof NoInternetConnectionException) { 
        ConstantsMethods.showOkButtonDialog(getContext(), getString(R.string.noInternetConnection), null); 
       } 
       Log.e(LoginFragment.class.getSimpleName(), e.getMessage()); 
      }); 
} 



    private Observable<WsResponse<SecurityQuestion>> getLoginObservable(String userName, String password) { 
     return Observable.<WsResponse<SecurityQuestion>>create(subscriber -> { 
      getPresenter().doLogin(getActivity(), userName, password, appType, 
        new Callback<Void, WsResponse<SecurityQuestion>>() { 
         @Override 
         public Void callback(final WsResponse<SecurityQuestion> param) { 
          subscriber.onNext(param); 
          return null; 
         } 
        }); 
     }); 
    } 

    private Observable<WsResponse<PatientDataProfile>> getFetchDataObservable() { 
     return Observable.create(subscriber -> { 
      new AfPatientsPresenter().fetchPatientData(getContext(), emailAddress, "", new Callback<Void, WsResponse<PatientDataProfile>>() { 
       @Override 
       public Void callback(WsResponse<PatientDataProfile> param1) { 
        subscriber.onNext(param1); 
        subscriber.onComplete(); 
        return null; 
       } 
      }); 
     }); 
    } 

一样多,我知道RxJava,我能弄清楚,getLoginObservable(editTextUsername.getText().toString(), password)观察到发送响应映射(map(response -> { ... }),并且此映射返回响应flatmap(flatMap(response -> { ... })和它的响应发送给用户。在这里,我只是迷失了,我如何跳过(第二个网络电话)平面图flatMap(response -> { ... }直接发送回应的订户在登录失败的情况下。而不是

回答

1

.map(response -> { 
       if (response.result) { 
        getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question); 
       } 
       return response; 
      }) 

你可以使用:

flatMap(response-> { 
    if (response.result) { 
     getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question); 
     return Observable.just(response); 
    } else { 
     return Observable.error(new Exception("Login failed")); // or maybe some LoginFailedException() you can reuse 
    } 
})