RXJava流等效于Login + Webservicecall

时间:2015-04-28 09:54:12

标签: java android reactive-programming rx-java

我正在深入研究rxJAva,我不确定我是否正在使用正确的逻辑。

需要实现的目标如下。考虑(现在

 LoginResult l;
 if (hasCachedLoginResult()) {
   l = getCachedLoginResult();
   if ( l.timePassed > 20mins) {
      l = null;
   }
 } 
 if (l == null) { // no cache or cache expired.
   if (canPerformLogin() /* user has entered credentials */ ) {
     l = performLogin();
   } else {
     showMessageToUserAskingCredentials();
     return;
   }
 }

 if (! l.isLoggedIn() ) { 
   showErrorToUser(l.errorMessage());
 } else {
   proceedWithNextWebserviceCall();
 }

这是因为我想在每次需要用户身份验证的网络服务调用上预先执行此“例行程序”。

我已经将“performLogin”和“proceedWithNextWebserviceCall”写成Observables,但我不知道如何将它们链接在一起。

我看到有一个'缓存'操作符但是当用户未经过身份验证时,proceedWithNextWebserviceCall可能会抛出错误(用户已更改密码,而我们正在使用带有旧cookie的缓存loginresult),所以我还需要使其无效缓存的loginResult并且无法找到任何关于此的文档。

谢谢

1 个答案:

答案 0 :(得分:0)

我也在深入研究RxJava,但你的代码对我来说似乎并不重要。对于链接动作,map方法非常有用。所以使用rx和lambda,我会这样写。

    Observable.from(hasCachedLoginResult())
            .map(hasCache -> hasCache ? getCachedLoginResult() : null)
            .map(loginResult -> loginResult != null ? loginResult : performLogin())
            .subscribe(loginResult -> proceedWithNextWebserviceCall(loginResult), errorLogin -> showError(errorLogin));

简而言之,您可以使用map方法将动作链接在一起。