检测所有流量何时产生价值

Detect when all flows produced value

我有两个函数可以将一些数据上传到数据库。

suspend fun addOverallRatingValue(productId: String): Flow<FirebaseEventResponse>
suspend fun markProductAsRatedByUser(productId: String): Flow<FirebaseEventResponse>

两人都是callbackFlow

override suspend fun markProductAsRatedByUser(productId: String) = callbackFlow {
        try {
            firebaseInstance
                ...
                .addOnSuccessListener {
                    trySend(FirebaseEventResponse.SuccessSetValue)
                }
                .addOnFailureListener {
                    trySend(FirebaseEventResponse.ExceptionOccurred.Event(it))
                }
        } catch (e: Exception) {
            trySend(FirebaseEventResponse.ExceptionOccurred.Event(e))
        }
        awaitClose { this.cancel() }
    }

我如何组合这两个流并在它们都发送任何 FirebaseEventResponse 时做出反应?

combine and zip 个函数可用于合并流:

combine(
    flow1,
    flow2,
) { result1, result2 ->
    // ... check results
}.launchIn(viewModelScope)

它们之间的区别在于 combine 在每个流发出最新值时触发,而 zip 在发出每对值时触发。这里有一个很好的article about Flow operators.

还有一个 merge 函数可以在不保留元素顺序的情况下将给定的流合并为一个流:

merge(flow1, flow2).onEach { result ->
    // ... use result
}.launchIn(viewModelScope)