使用rxjava

时间:2019-01-10 16:53:22

标签: recursion observable rx-java eventemitter

我正在使用此代码,我需要在rxjava中创建一个返回且可观察的递归方法,我基于下一个代码:

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),但是现在的问题是,我只从集合中获得了第一项,而省略了其他项。

提前谢谢!

0 个答案:

没有答案