2016-03-20 3 views
0

Ich habe zwei Observablen:Holen Sie sich das vorletzte beobachtbaren einer verketteten Karte() -Aufruf in Rx Java

  1. Observable<User> createUser(UserData userData)
  2. Observable<Void> loginUser(User user)

Nachdem der Benutzer erstellt ein neues Konto Ich möchte anmelden mit diesem neuen Konto. Also habe ich das getan:

createUser(userData).map(user -> loginUser(user)); 

Aber auf diese Weise erhalte ich eine Observable<Void> als Rückkehr. Ich möchte createUser(userData).map(user -> loginUser(user)) anrufen und eine Observable<User> als Rückgabe erhalten. Etwas wie dieses:

@Override 
public Observable<User> createUserAndLogin(){ 

    createUser(userData).map(user -> loginUser(user)); 

} 

Wie könnte ich das tun?

Antwort

1

Warum nicht Log-in als Nebeneffekt mit doOnNext verwenden?

createUser(userData).doOnNext(user -> loginUser(user)); 

Wenn Sie sicher, dass die Log-in machen wollen passiert:

createUser(userData).flatMap(user -> { 
    // attach a callback to the log-in and return 
    // the user from the previous call 
    return loginUser(user).map(dontCare -> user); 
}); 

Aber ich bin nicht sicher, wie es geht, zu arbeiten, wenn loginUser nichts abgibt, so vielleicht gewaltsam concat den gewünschten Wert zum leeren loginUser beobachtbar:

createUser(userData).flatMap(user -> { 
    // attach a callback to the log-in and return 
    // the user from the previous call 
    return loginUser(user).concatWith(Observable.just(user)); 
}); 
+0

großartig! Aber noch eine Frage: Wenn ich Code in onNext() und onError() Methoden des loginUser Observable ausführen möchte, wie kann ich sie mit createUser Observable kombinieren? Weil ich eine Nachricht anzeigen möchte, wenn das loginUser Observable einen Fehler und eine andere Nachricht gibt, wenn das loginUser Observables erfolgreich ist * ie * ** createUser == Ok und Login == Ok -> OperationSuccessfull -> return User ** und ** createUser = = Ok und Login == Fehler -> Error return null und show erro message ** – regmoraes

+1

Wenn das Ergebnis einen Effekt auf die Kette von Observablen haben soll, ** verwende nicht einen Nebeneffekt 'Observable.doOnX' . Sobald Sie eine der Nicht-Nebeneffekt-Methoden gewählt haben, können Sie 'Observable.onErrorX' verwenden, um unerwartete Fehler asynchron zu behandeln. Lesen Sie dies für weitere Informationen: https://github.com/ReactiveX/RxJava/wiki/Error-Handling –

Verwandte Themen