2016-09-15 61 views
1

我使用TheMovieDb API https://www.themoviedb.org/documentation/api如果我想進行身份驗證,我必須使用三個步驟來執行此操作 - 獲取令牌,使用令牌創建會話並獲取會話ID。我想用3 Observable來做到這一點,但我不知道如何能連鎖Observables這樣做。如何連接鏈中的多個Observable

Observables

public interface AuthenticationService { 

@GET("authentication/token/new") 
Observable<Token> getMdbToken(); 

@GET("authentication/token/validate_with_login") 
Observable<Token> createSessionId(Credentials credentials,String token); 

@GET("authentication/session/new") 
Observable<Session> getSessionId(String token); 
} 

這是可能鏈Observables,使一個Observable?我沒有使用經驗Observables

回答

0

flatMap操作員對此很理想。只寫3個觀察對象:

getMdbToken() 
     .flatMap(new Func1<Token, Observable<Token>>() { 
      @Override 
      public Observable<Token> call(Token token) { 
       return createSessionId(credentials, token); 
      } 
     }).flatMap(new Func1<Token, Observable<Session>>() { 
    @Override 
    public Observable<Session> call(Token token) { 
     return getSessionId(String token); ; 
    } 
}); 
+0

謝謝,這個工程。但是這會按特定順序來做嗎?例如,getSessionId可能會在createSessionId之前啓動嗎? –

+0

在一般情況下不能保證。 'flatMap'不保證順序(參見[diagram](http://reactivex.io/documentation/operators/images/flatMap.c.png))。如果您必須確保訂單查找'concatMap'([diagram](http://reactivex.io/documentation/operators/images/concatMap.png))。然而,在你的情況下,它是不相關的,因爲你序列中的每個'Observable'只會產生一個'onNext'事件。 –