Сначала я запрашиваю некоторые документы в Firestore, используя этот queryWaitingRoom(), и вызываю runTransactionInWaitingRoom(), если результат удовлетворяет условию.
Вот первая функция:
private fun queryWaitingRoom() {
waitingRoomRef
.orderBy("isAvailable", Query.Direction.DESCENDING)
.limit(1)
.get()
.addOnSuccessListener { documents ->
if (!documents.isEmpty){
for (document in documents) {
val waitingRoomId = document.get("id").toString()
runTransactionInWaitingRoom(waitingRoomId)
}
}
}
}
Мой вопрос: в runTransactionInWaitingRoom(), если значение currentState не равно true, как я могу остановить transaction прямо в блоке else? и снова позвонить в queryWaitingRoom()? Вот вторая функция:
private fun runTransactionInWaitingRoom(waitingRoomId: String){
val docRef = waitingRoomRef.document(waitingRoomId)
db.runTransaction { transaction ->
val snapshot = transaction.get(docRef)
val currentState = snapshot.getBoolean("isAvailable")
if (currentState == true){
transaction.update(docRef, "isAvailable", false)
} else {
///// STOP THE TRANSACTION RIGHT HERE /////
///// And call the the queryWaitingRoom() again /////
Log.d("OIWENCLKSJF", "Transaction.currentState != true") // getting called 5 or 6 times.
throw FirebaseFirestoreException("Population too high", // only get called at the last attemp.
FirebaseFirestoreException.Code.ABORTED)
}
}.addOnSuccessListener {
}.addOnFailureListener { e ->
Log.w("OIWENCLKSJF", "Transaction failure.", e)
}
}
Что я получил до сих пор, так это то, что transaction продолжает вызывать себя, даже если я бросаю exception в блок else. У меня есть аналогичный вопрос прямо здесь, в SO, но это не помогло. Я буду очень признателен, если кто-то может немного направить меня.
isAvailableчастью того же документа, что иid? - person Alex Mamo   schedule 14.10.2020isAvailableвзято из того же документа. ТакжеisAvailableможет иметь только два значения..trueиfalse. При первом создании он получает значениеtrue. - person Junior   schedule 14.10.2020