2017-10-13 93 views
0

我正在開發一個項目,在該項目中,我想在返回結果之前迭代列表併合並它們。基本上我試圖將PostResponse對象轉換爲PostRxJava2在toList之後沒有收到doOnNext

一些相關的代碼。

Post.java

public class Post { 
    @NonNull private User user; 
    @NonNull private String title; 
    @NonNull private String body; 
    @NonNull private Integer id; 
} 

PostResponse.java

public final class PostResponse{ 
    private Integer userId; 
    private Integer id; 
    private String title; 
    private String body; 
} 

獲取帖子

@Override public Observable<List<Post>> posts() { 
     return postDataStore.getAllPosts() 
       .flatMap(postResponses -> Observable.fromIterable(postResponses) 
         .flatMap(postResponse -> postDataMapper.transform(postResponse)) 
         // Receiving output here 
         .doOnNext(post -> Log.i(TAG, "posts: " + post)) 
         .toList() 
         .toObservable() 
         // Not Receiving output here 
         .doOnNext(posts -> Log.i(TAG, "posts: " + posts))); 
    } 

變換上述調用的函數。

public Observable<Post> transform(final PostResponse postResponse) { 
     return Observable.create(emitter -> { 
      final Post post = new Post(postResponse.getId()); 
      post.setTitle(postResponse.getTitle()); 
      post.setBody(postResponse.getBody()); 
      userRepository.user(postResponse.getUserId()).doOnNext(user -> { 
       post.setUser(user); 
       emitter.onNext(post); 
      }).subscribe(); 
     }); 
    } 

但我沒有收到所訂閱posts()doOnNext任何數據。不知道什麼是錯的。

我很抱歉,如果我犯了一個非常愚蠢的錯誤。

+0

用某些100%有數據的數據源替換'postDataStore.getAllPosts()',例如從列表中查看,然後檢查。如果你在'onNext'中得到了一些東西,這意味着你的'postDataStore'不會返回任何東西 – Divers

+0

對不起,我編輯了這個問題,所以它應該更清晰。 'getAllPosts'發射很好。 – riteshakya037

+0

'toList()'操作符要求observable完成。你的觀察結果完整嗎? –

回答

1

速戰速決是添加:

emitter.onComplete();

後您的emitter.onNext(post);

正確的,但,我會建議重新考慮設計和邏輯。特別是您的轉換不需要創建新的Observable。我會重新設計tranform方法是這樣的:

Observable<Post> transform(PostResponse postResponse) { 
    return userRepository.user(postResponse.getUserId()) 
     .map(user -> parseResponse(parseResponse, user)); 
} 


Post parseResponse(PostResponse response, User user) { 
    final Post post = new Post(postResponse.getId()); 
    post.setTitle(postResponse.getTitle()); 
    post.setBody(postResponse.getBody()); 
    post.setUser(user); 

    return post; 
} 

這樣你避免創建一個新的Observable,您避免內訂閱,您對結果的單一控制點,那就是在認購的最終結果Observable

+0

我同意一個更清晰的解決方案。謝謝 – riteshakya037