在另一个完成后触发coroutine

问题描述 投票:0回答:1
我确实有一个应用程序,我必须调用端点以提取产品列表和另一个端点才能提取产品类型列表。

第二个端点仅返回类型列表,但我需要添加类型

All

并添加产品总数`

因此看起来像:
 - >端点呼叫产品列表:返回所有产品的JSON
 - >端点呼叫类型列表:返回所有类型。

当收到所有类型时,我在列表开头添加了所有类型并计算产品数量。因此,我需要在调用另一个端点之前进行第一个端点调用。

我为初始化做了这种方式:

private var listOfProducts: List<Product> = emptyList() private var listOfTypes: List<Type> = emptyList() private var selectedType: String = "" init { fetchProducts() fetchTypes() }

the的地方是呼叫:

fun fetchProducts() { viewModelScope.launch { API_CALL { listOfProducts = response } } }
   
   fun fetchTypes() {
      viewModelScope.launch {
         API_CALL {
            nb_films = listOfProducts.count()
            listOfTypes = Type("all", nb_films) + response
         }
      }
   }

因此,代码并不完美,但这只是总结一下问题。
我需要将来自提取物中的信息使用到fetchtypes中。在某些情况下,由于获取数据的延迟而失败了。
任何想法如何阻止fetchtypes的触发器或进行2个调用,但要等待一个在处理数据之前结束一个
	

您的API调用同时运行,导致FetchTypes()有时会使用空列表。

一种解决方案是使用状态流来反应链接呼叫并保证顺序:

// ViewModel private val _products = MutableStateFlow<List<Product>>(emptyList()) val products: StateFlow<List<Product>> = _products private val _types = MutableStateFlow<List<Type>>(emptyList()) val types: StateFlow<List<Type>> = _types init { viewModelScope.launch { // 1. Fetch products first _products.value = api.getProducts() // 2. Fetch types AFTER products are loaded val typesResponse = api.getTypes() val allType = Type("All", _products.value.size) // Use product count _types.value = listOf(allType) + typesResponse } }

这种方式
android kotlin android-jetpack-compose kotlin-coroutines android-jetpack
1个回答
0
投票
仅在getProducts()成功之后才开始

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.