2017-02-27 43 views
1

要建立一个完整的User实体,我需要执行此任务:从userId 无法建立这种可观察

    1. 得到一个UserResponse(REST API响应)从userId
    2. 得到一个 List<Role>
    3. 获取从UserResponse.addressId
    4. 一个Address构建从UserResponseUserList<Role>Address

    我尝试这样做:

    public Observable<User> getUserById(String userId) {  
        return Observable.zip(getUserResponse(userId), getRoles(userId), new Func2<UserResponse, List<Role>, User>() { 
         @Override 
         public User call(UserResponse response, List<Role> roles) { 
          //I need the address here! 
         } 
    }); 
    

    但我不知道如何使用AddressRepository来从UserResponse.addressIdAddress

    public interface AddressRepository { 
        Observable<Address> getAddress(String addressId); 
    } 
    

    User构造是这样的:

    public User(String userId, Address address, List<Role> roles) { ... } 
    

    我希望你能理解。很难解释这个问题。

  • 回答

    2

    使用cache()操作:

    public Observable<User> getUserById(String userId) { 
        Observable<UserResponse> response = getUserResponse(userId).cache(); 
        return Observable.zip(
        response, 
        response.flatMap(new Func1<UserResponse, Observable<Address>>() { 
         @Override 
         public Observable<Address> call(UserResponse resp) { 
          return addressRepository.getAddress(resp.addressId); 
         } 
        }), 
        getRoles(userId), new Func3<UserResponse, Address, List<Role>, User>() { 
         @Override 
         public User call(UserResponse resp, Address ad, List<Role> roles) { 
          //Now, I have all I need to build the User =) 
         } 
        } 
        }); 
    } 
    
    +0

    但是你不使用上面的'cache()'操作符 –

    +0

    Whop,编辑和修复! –

    0

    我找到了一个解决方案:

    public Observable<User> getUserById(String userId) { 
        return Observable.zip(
         getUserResponse(userId), 
         getUserResponse(userId).flatMap(new Func1<UserResponse, Observable<Address>>() { 
          @Override 
          public Observable<Address> call(UserResponse resp) { 
           return addressRepository.getAddress(resp.addressId); 
          } 
         }), 
         getRoles(userId), new Func3<UserResponse, Address, List<Role>, User>() { 
          @Override 
          public User call(UserResponse resp, Address ad, List<Role> roles) { 
           //Now, I have all I need to build the User =) 
          } 
         } 
    }); 
    

    任何意见将不胜感激。 “重复”getUserResponse(userId)的呼叫是否是一种很好的做法?我没有找到解决这个问题的另一种方法。

    +0

    getUserResponse(用户ID).publish.autoConnect(2);将其设置为ConnectableObservable,并且只会开始发布2个订阅者的位置,这样您将只调用一次后端。 –

    1
    getUserResponse(userId).publish.autoConnect(2); 
    

    将使其ConnectableObservable只有开始出版哪里有2个用户,这样你会一次调用后端。

    getUserAddress()将调用getUserResponse并从中获取地址。

    现在拉链getUserResponse,getUserAddress和getRoles(用户ID)一起:)

    1

    您可以使用flatMap一个变种这样做

    public Observable<User> getUserById(String userId) { 
        return Observable.zip(
          getUserResponse(userId).flatMap(new Func1<UserResponse, Observable<Address>>() { 
          @Override 
          public Observable<Address> call(UserResponse resp) { 
           return addressRepository.getAddress(resp.addressId); 
          } 
          }, 
          new Func2<UserResponse, Address, Pair<UserResponse,Address>>() { 
          @Override 
          public Pair<UserResponse,Address> call(UserResponse resp, Address addr) { 
           return new Pair<UserResponse,Address>(resp,addressRepository.getAddress(resp.addressId)); 
          }  
          }), 
          getRoles(userId), 
          new Func2<Pair<UserResponse, Address>, List<Role>, User>(){ 
          @Override 
          public User call(UserResponse resp, Address ad, List<Role> roles) { 
          //Now, I have all I need to build the User 
          }    
          } 
         ); 
    }