2016-09-15 22 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'事件。 –