如何在 Apollo 客户端上使用 runBlocking?

问题描述 投票:0回答:0

我在 Kotlin 应用程序(JVM 命令行应用程序,而不是 Android)中使用 Apollo 客户端来获取分页数据,每个“页面”都被添加到一个列表中。理论上,使用 runBlocking 应该允许调用函数获取 Apollo 客户端获取的数据,但它似乎在实践中不起作用 - 请参见下面的示例代码。完成此任务的正确(或至少更好)方法是什么?

// Simple pagination using Apollo client
class FooSource(private val query: String, private val apolloClient: ApolloClient) {

    override suspend fun load(params: PageParams): LoadResult<Foo> {
        val response = try {
            apolloClient.query(
                FooQuery(
                    queryString = query,
                    pageSize = params.pageSize,
                    cursor = params.cursorNext
                )
            ).execute()
        } catch (e: Exception) {
            return LoadResult(e)
        }

        // Successfully prints a non-zero list size
        println("Source data: ${response.data.size}")
        return LoadResult(result.data, result.endCursor)
    }
}

// Fetch the data 
fun getData(query: String, apolloClient: ApolloClient) {
    var source = FoodSource(query, apolloClient)
    val data = mutableListOf<T>()
    var hasNext = false

    do {
        val result  = runBlocking {
            source.load(params)
        }
        // Shows as zero, since we always recieve an empty list
        println("Recieved data: ${response.data.size}")
        data.addAll(result.data)
        params.cursorNext = result.cursorNext
        hasNext = result.hasNext()

    } while (hasNext)
}
kotlin graphql apollo kotlin-coroutines
© www.soinside.com 2019 - 2024. All rights reserved.