Java rx вложенные асинхронные вызовы - PullRequest
0 голосов
/ 21 декабря 2018

Я сейчас работаю с библиотекой java rx, у меня проблемы с внутренними вызовами с flatMap и map, по какой-то причине не выполняется самый внутренний вызов.

Кроме того, если я заменюflatMap с suscribe () во внутреннем вызове (перед кодом 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 голосов
/ 22 декабря 2018

Чтобы активировать цепочку наблюдателей, должна быть подписка.Вы не подписаны на цепочку наблюдателей, которая начинается с dCSService....flatMap() сам не подпишется на свои внутренние наблюдаемые, пока не будет подписана внешняя цепочка наблюдаемых.

...