【发布时间】:2019-06-27 13:26:29
【问题描述】:
我正在尝试使用 fromIterable 和 flatMap 运算符的简单代码。我只是在我的代码中将长值流映射到Result 流。没有别的了
这是我的代码。 我的课是空的
class Result {
@Override
public String toString() {
return "result";
}
}
还有一个函数
public Observable<Result> getResults(List<Long> requests) {
return Observable.fromIterable(requests)
.flatMap( aLong -> {
Result[] items = {new Result(), new Result()};
return Observable.fromIterable(Arrays.asList(items));
});
}
我订阅这个如下
List<Long> ids = new ArrayList<>(Arrays.asList(1L, 2L, 3L));
getResults(ids)
.subscribe(new DisposableObserver<Result>() {
@Override
public void onNext(Result item) {
Log.d(TAG, "onNext: " + item);
}
@Override
public void onComplete() {
Log.d(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
});
我的预期输出是
LOG: onNext: result
LOG: onNext: result
LOG: onNext: result
LOG: onNext: result
LOG: onNext: result
LOG: onNext: result
LOG: onCompleted:
对于fromIterable 的每次发射,flatMap 预计会返回一个具有 2 个值的流,因此总共 6 次 onNext 然后是 onComplete
但我得到的是
LOG: onNext: result
LOG: onNext: result
LOG: onCompleted:
只有 2 次 onNext 被触发然后完成。剩下的 4 个值去哪了?
但奇怪的是,我在我的getResults函数中,在fromIterable的doOnNext上加了一个Log,如下
public Observable<Result> getResults(List<Long> requests) {
return Observable.fromIterable(requests)
.doOnNext(i -> Log.d(TAG, "fromIterable emitted " + i))
.flatMap(aLong -> {
Result[] items = {new Result(), new Result()};
return Observable.fromIterable(Arrays.asList(items));
});
}
现在它正在发出所有值!!!!这是输出
LOG: fromIterable emitted 1
LOG: onNext: result
LOG: onNext: result
LOG: fromIterable emitted 2
LOG: onNext: result
LOG: onNext: result
LOG: fromIterable emitted 3
LOG: onNext: result
LOG: onNext: result
LOG: onCompleted:
这里发生了什么? onNext 对链进行了哪些更改以发出所有值?
【问题讨论】:
-
您没有看到所有日志的可能原因是如果它们看起来太接近,日志会删除相似的消息。如果您记录独特的消息,则应显示所有 6 个 onNext。
-
@akarnokd Ohh.. 所以这似乎是一个日志记录问题。与 RxJava 无关吧?