2015-07-03 62 views
1

有一些我想用Obserbles来完成,但我不能想到这样做的一种方式。Rxjava Observables dependency

想象我有:

  • ObservableA
  • ObservableB

为了使用ObservableB,我需要从ObservableA结果。 得到ObservableB的结果后,我需要构造一个对象 与ObservableA和Observable B的结果。

这是做适当的运算符=?我找不到任何。

我试着用拉链:

return Observable.zip(
     observableA.flatMap(A -> ObservableB(A)) 
     , 
     ObservableA 
     , new Func2<B, A, Object>() { 
      @Override 
      public Object call(B b, A a) { 
       String ab = someFunction(a.someFunction()); 
       return new Object(a, ab, b); 
      } 
     }); 

但是拉链回报的项目不是另一个观察的。

编辑:我设法把它做:

return Observable.zip(
      getRosterEntry(userXmppAddress).flatMap(rosterEntry -> getRosterPresence(rosterEntry.getUser())) 
      , 
      getRosterEntry(userXmppAddress) 
      , new Func2<Presence, RosterEntry, Friend>() { 
       @Override 
       public Friend call(Presence presence, RosterEntry rosterEntry) { 
        String finalUserXmppAddress = AppXmppUtils.parseXmppAddress(rosterEntry.getUser()); 
        return new Friend(rosterEntry.getName(), finalUserXmppAddress, presence); 
       } 
      }).flatMap(Observable::just); 

但它似乎有点overcoded。有没有其他方法可以实现这一点?

回答

1

你应该能够做这样的事情:

getRosterEntry(userXmppAddress) 
     .flatMap(new Func1<RosterEntry, Observable<Friend>>() { 
      @Override 
      public Observable<Friend> call(final RosterEntry rosterEntry) { 
       return getRosterPresence(rosterEntry.getUser()) 
         .map(new Func1<Presence, Friend>() { 
          @Override 
          public Friend call(Presence presence) { 
           String finalUserXmppAddress = AppXmppUtils.parseXmppAddress(rosterEntry.getUser()); 
           return new Friend(rosterEntry.getName(), finalUserXmppAddress, presence); 
          } 
         }); 
      } 
     });