Рекурсия с rxjava - PullRequest
       21

Рекурсия с rxjava

0 голосов
/ 10 января 2019

Я работаю с этим кодом, мне нужно создать рекурсивный метод в rxjava, который возвращает и Observable, я основан на следующем коде:

public Observable<Item> getComments(final Item parentItem) {
  if (parentItem.hasKids()) {
    return Observable.merge(
      Observable.just(parentItem),
      Observable.fromArray(parentItem.getKids())
        .flatMap(ids -> getItems(ids))
        .flatMap(item -> {
          item.indent = parentItem.indent + 1;
          return getComments(item);
        })
    );
  } else {
    return Observable.just(parentItem);
  }
}

Этот код предположительно должен выдавать список элементов, я новичок в rxjava, и у меня есть сомнения, как я могу использовать этот метод в другом, итерировать каждый элемент для представления информации.

Кроме того, это мой код:

private fun getItems(parentItem: Single<NavItem>, dCSServiceContext: DCSServiceContext): Observable<NavItem> {
        return parentItem.map { it }.flatMapObservable {
            if (it.hasChildren) {
                Observable.merge(
                        Observable.just(it),
                        Observable.from(it.childrenIds).map { id ->
                            var list = arrayListOf<Int>()
                            list.add(id)
                            dCSServiceContext.contentIds = list
                            getNavItemById(dCSServiceContext)
                        }.flatMap { getItems(it, dCSServiceContext) })
            } else {
                Observable.just(it)
            }
        }
    }

 override fun getNavMenuItems(dCSServiceContext: DCSServiceContext): Observable<NavItem> {
        return getItems(getNavItemById(dCSServiceContext), dCSServiceContext)
    }

Я использую это таким образом:

override fun getSportList(dCSServiceContext: DCSServiceContext): Single<SportsResponse> {
        return scribeService.getNavMenuItems(dCSServiceContext).toSingle().map { navMenu ->
            SportsResponse(navMenu as NavMenu)
        }
    }

Но моя проблема в том, что я не могу перебрать каждый испущенный элемент, потому что я получаю ошибку: Observable испустил слишком много элементов. Я использовал метод: take (1), но проблема сейчас в том, что я получаю только первый элемент из коллекции, остальные опущены.

Спасибо заранее !!

...