检测所有流量何时产生价值
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(
flow1,
flow2,
) { result1, result2 ->
// ... check results
}.launchIn(viewModelScope)
它们之间的区别在于 combine
在每个流发出最新值时触发,而 zip
在发出每对值时触发。这里有一个很好的article about Flow
operators.
还有一个 merge
函数可以在不保留元素顺序的情况下将给定的流合并为一个流:
merge(flow1, flow2).onEach { result ->
// ... use result
}.launchIn(viewModelScope)
我有两个函数可以将一些数据上传到数据库。
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(
flow1,
flow2,
) { result1, result2 ->
// ... check results
}.launchIn(viewModelScope)
它们之间的区别在于 combine
在每个流发出最新值时触发,而 zip
在发出每对值时触发。这里有一个很好的article about Flow
operators.
还有一个 merge
函数可以在不保留元素顺序的情况下将给定的流合并为一个流:
merge(flow1, flow2).onEach { result ->
// ... use result
}.launchIn(viewModelScope)