2017-06-24 1 views
1

Fondamentalement, je dois d'abord se connecter à l'utilisateur, si son succès, je dois ajouter un magasin et se déconnecter. L'interface de mise à niveau est donnée ci-dessousRetrofit, RxJava faire une demande si la première est réussie

@POST("merchant/register") 
Observable<BaseResponse<String>> Login(@Body Merchant merchant); 

@PUT("merchant/{username}") 
Observable<BaseResponse<Merchant>> Logout(); 

@POST("shop") 
Observable<BaseResponse<Shop>> addShop(@Body Shop shop); 

Les sont créés observables donné

Observable<BaseResponse<String>> loginObs = apiService.Login(merchant); 
Observable<BaseResponse<Merchant>> addShopObs = apiService.addShop(shop); 
Observable<BaseResponse<String>> logoutObs = apiService.Logout(); 

La réponse de base a un champ de succès basé que je décide si la connexion a réussi. Je pense que je peux utiliser la carte pour vérifier le succès du premier observateur de connexion, mais je ne sais pas quoi faire si la connexion échoue. Comment puis-je annuler toute la chaîne?

Répondre

3

Vous pouvez commencer par les loginObs, flatMap le loginResponse à un autre observable en fonction du succès de la connexion, donc soit retourner le addShopObs ou retourner une erreur observable

(qui mettra fin à la chaîne avec une erreur)

Ensuite, vous pouvez continuer normalement à flatMap the merchantResponse aux logoutObs.

Voilà comment cela peut être réalisé:

loginObs(merchant) 
    .flatMap(loginResponse -> { 
     if (/*successful check*/) 
      return addShopObs; 
     else 
      return Observable.error(new Exception("Login failed!")); 
      // or throw your own exception, this will terminate the chain and call onError on the subscriber. 
    }) 
    .flatMap(merchantResponse -> logoutObs) 
    .subscribe(logoutResponse -> { 
     /*all operations were successfull*/ 
    }, throwable -> { 
     /*an error occurred and the chain is terminated.*/ 
    });