Java rx嵌套异步调用

时间:2018-12-21 20:16:37

标签: java kotlin rx-java

我现在正在使用java rx库,在使用flatMap和map进行内部调用时遇到问题,由于某些原因,大多数内部调用未完成。

此外,如果我在内部调用中使用suscribe()替换flatMap(在childrenItemsResponse.forEach代码之前),则该代码将被执行,执行不同步,这意味着此调用在主flatMap之后完成执行完成。

这是我的代码:

override fun getSportList(dCSServiceContext: DCSServiceContext): Single<List<EntityBrowse>> {
        return dCSService.get(dCSServiceContext).flatMap { item ->
            val entityBrowseList = arrayListOf<EntityBrowse>()
            val section = builSection(item?.firstOrNull()!!)
            if (item.firstOrNull()?.collections?.get("NavItems")?.size!! > 0) {
                dCSServiceContext.contentIds = item.firstOrNull()?.collections?.get("NavItems")
                buildNavItems(dCSServiceContext).map { section ->
                    return@map section
                }.map { items ->
                    section.items = items
                    return@map entityBrowseList
                }
            } else {
                Single.just(entityBrowseList)
            }
        }
    } 

问题在buildNavItems方法中出现:

private fun buildNavItems(dCSServiceContext: DCSServiceContext): Single<MutableList<Item>> {
        return dCSService.get(dCSServiceContext).map { itemsResponse ->
            val items: MutableList<Item> = arrayListOf()
            itemsResponse.forEach { item ->
                val transformedItem = buildItem(item!!)
                if (item?.collections?.get("NavItems") != null) {
                    dCSServiceContext.contentIds = item?.collections?.get("NavItems")
                    val childrenItems: MutableList<Item> = arrayListOf()
                    dCSService.get(dCSServiceContext).flatMap { childrenItemsResponse ->
                        childrenItemsResponse.forEach { childrenItem ->
                            val transformedChildrenItem = buildItem(childrenItem!!)
                            childrenItems.add(transformedChildrenItem)
                        }
                        val section = Section("", "", false,childrenItems )
                        val data = Data(section)
                        val children = Children(data)
                        transformedItem.children = children
                        items.add(transformedItem)
                        Single.just(items)
                    }
                } else {
                    val transformedItem = buildItem(item!!)
                    items.add(transformedItem)
                }
            }
            return@map items
            //Single.just(items)
        }
    }

更具体地说,行代码中的dCSService.get(dCSServiceContext).flatMap { childrenItemsResponse ->

此代码永远不会执行。

我不确定是什么原因引起的。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

要激活观察者链,必须进行订阅。您没有订阅以dCSService...开头的观察者链。 flatMap()本身将不会订阅其内部可观测对象,除非已订阅了外部可观测链。