RxJava: fromIterable не излучает все элементы - PullRequest
0 голосов
/ 22 ноября 2018

Я пробовал простой код с операторами 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

Но что я получаюis

    LOG: onNext: result
    LOG: onNext: result
    LOG: onCompleted:        

Только 2 раза срабатывает onNext, а затем завершается.Куда делись оставшиеся 4 значения?

Но странно то, что я добавил Log к doOnNext из fromIterable в моей getResults функции следующим образом

    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 внесло в цепочку для генерации всех значений?

1 Ответ

0 голосов
/ 27 июня 2019

как объяснил @akarnokd, вы записываете подобный текст в очень коротком количестве.Ведение журнала должно быть уникальным в вашем случае,

List<Long> ids = new ArrayList<>(Arrays.asList(1L, 2L, 3L));

    getResults(ids)
            .subscribe(new DisposableObserver<Result>() {
                @Override
                public void onNext(Object item) {
                    Log.d(TAG, "onNext: called at " + System.currentTimeMillis());
                }

                @Override
                public void onComplete() {
                    Log.d(TAG, "onCompleted: ");
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "onError: " + e.getMessage());
                }
            });

или упоминаться в вашей наблюдаемой аналогично

  ...
  .doOnNext(i -> Log.d(TAG, "fromIterable emitted " + i))
  ...
...