RxJava2 在 toList 之后没有收到 doOnNext
RxJava2 not receiving doOnNext after toList
我正在做一个项目,在这个项目中我想迭代一个 List 并在返回结果之前将它们组合回去。基本上我正在尝试将 PostResponse
对象转换为 Post
.
一些相关代码。
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();
});
}
但是我在 doOnNext
上没有收到订阅 posts()
的任何数据。不知道哪里出了问题。
如果我犯了一个非常愚蠢的错误,我深表歉意。
快速解决方法是添加:
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
的订阅中.
我正在做一个项目,在这个项目中我想迭代一个 List 并在返回结果之前将它们组合回去。基本上我正在尝试将 PostResponse
对象转换为 Post
.
一些相关代码。
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();
});
}
但是我在 doOnNext
上没有收到订阅 posts()
的任何数据。不知道哪里出了问题。
如果我犯了一个非常愚蠢的错误,我深表歉意。
快速解决方法是添加:
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
的订阅中.