2017-10-13 95 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