Как связать вызовы в зависимости от результата, когда второй вызов является рекурсивным методом? - PullRequest
0 голосов
/ 24 декабря 2018

Я работаю с java rx версии 1.2.10

В моем Api мне нужно соединить два асинхронных вызова: первый вызов дает мне элементы Второй вызов дает мне подэлементы из этого элемента, но еслиподэлементы имеют больше «подэлементов». Я должен рекурсивно вызывать второй метод и добавлять соответствующие подэлементы.

В своем коде я написал что-то вроде вызова первого:

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")
               //This is the second call.
               buildNavItems(dCSServiceContext).map { sectionItems ->
                   return@map sectionItems
               }.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")

                    //Alternative 2: Recursion to fill the internal items, this code is not been called now.
                    buildNavItems(dCSServiceContext).map { childrenItems ->
                        val section = Section("", "", false,childrenItems )
                        val data = Data(section)
                        val children = Children(data)
                        transformedItem.children = children
                        items.add(transformedItem)
                    }

                } else {
                    val transformedItem = buildItem(item!!)
                    items.add(transformedItem)
                }
            }
            return@map items
            //Single.just(items)
        }
    }

Проблема в том, что рекурсивный вызов buildNavItems (dCSServiceContext) .map никогда не выполнялся, я пытался использовать flatMap, но после окончания выполненияэтот код никогда не вызывался, и эти подэлементы не были добавлены в окончательный список.

...