【问题标题】:Getting rid of nested Task type摆脱嵌套的任务类型
【发布时间】:2023-04-03 11:34:01
【问题描述】:

是否可以摆脱嵌套的 Task 泛型?

对于每个continueWith 语句,都会在类型中添加一个新的Task。每个延续都是类型的一部分。理想情况下,我会返回一个任务,该任务连续执行每个任务并成功或失败。

示例

第一个操作查询用户的组

private fun getGroupsSnapshot(): Task<QuerySnapshot> {
    val userId = Auth.currentUser()!!.uid
    val query = userGroupsQuery(groupsCollection, userId)
    return query.get()
}

第二个操作查询这些组中的相册。

fun getAlbums(): Task<Task<List<Album>>> {
    return getGroupsSnapshot().continueWith { task ->
        val documentSnapshots = TaskUtils.getResult(task)
        val albums = mutableListOf<Album>()
        val fetchAlbumTasks = documentSnapshots.documents.map { document ->
            Log.d(TAG, document["name"].toString())
            document.reference.collection("albums").get().addOnCompleteListener { queryTask ->
                albums.addAll(toObjects(Album::class.java, queryTask))
            }
        }
        return@continueWith Tasks.whenAll(fetchAlbumTasks).continueWith allTasks@ {
            return@allTasks albums as List<Album>
        }
    }
}

但是我希望此操作返回类型 Task&lt;List&lt;Album&gt;&gt; 以保持界面清洁。

【问题讨论】:

  • 谢谢!我会读这个。

标签: android kotlin google-cloud-firestore google-tasks-api


【解决方案1】:

要组合多个Task,您应该使用continueWithTask 而不是continueWith。它接受Continuation&lt;TResult, Task&lt;TContinuationResult&gt; 作为参数,这实质上将返回的Task 展平并避免嵌套。您应该将其视为 Monads 中的 mapflatMap 操作(即 List),在这种情况下,如果您使用 List 而不是 @ 作为容器,continueWithTask 将等效于 flatMap 987654332@(请记住,使用flatMap 可以将List 的每个元素转换为新的List,并将生成的List 展平)

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2014-02-12
    • 2019-08-28
    相关资源
    最近更新 更多