Объединение нескольких задач firestore в потоке сопрограммы

#kotlin #google-cloud-firestore #kotlin-coroutines #coroutine

# #котлин #google-облако-firestore #kotlin-сопрограммы #сопрограмма

Вопрос:

Приведенный ниже код дает мне желаемый результат, извлекая данные из firestore с помощью потока сопрограмм.

  suspend fun getFeedPer() = flow<State<Any>> {
    emit(State.loading())

    val snapshot = dbRef.collection("FeedInfo/FeedPercent/DOC/")
        .whereGreaterThanOrEqualTo("bodyWeight", 0.80)
        .limit(1)
        .get().await()
    val post = snapshot.toObjects(FeedPer::class.java)
    Log.d("TAG", "getFeedPer: ${snapshot.documents[0].id}")
    Log.d("TAG", "getFeedPer: $post")
    emit(State.success(post))
}.catch {
    emit(State.failed(it.message.toString()))
}.flowOn(Dispatchers.IO)
 

Теперь я пытаюсь добавить еще один фильтр в свой запрос. Для этого я использую task.

     val docRef=dbRef.collection("FeedInfo/FeedPercent/DOC/")
    val task1=docRef.whereGreaterThanOrEqualTo("bodyWeight", 0.80)
        .limit(1).get()
    val task2=docRef.whereLessThanOrEqualTo("bodyWeight", 0.80)
        .limit(1).get()
 

теперь о том, как это сделать с помощью потока сопрограмм.

Пожалуйста, помогите, спасибо

Комментарии:

1. Что именно сделано? Каков желаемый результат, и на чем вы застряли в достижении этого?

Ответ №1:

Вы должны поместить задачу в CoroutineScope, и все остальное будет таким же, как и раньше.

  emit(State.loading())

    var eMsg = ""
    val docRef = dbRef.collection("FeedInfo/FeedPercent/DOC/")
    val task1 = docRef.whereGreaterThanOrEqualTo("bodyWeight", 0.80)
        .limit(1).get()
    val task2 = docRef.whereLessThanOrEqualTo("bodyWeight", 0.80)
        .orderBy("bodyWeight", Query.Direction.DESCENDING)
        .limit(1).get()
   /** Need to do query Direction here to get correct data*/

    coroutineScope {
        val allTask: Task<List<QuerySnapshot>> = Tasks.whenAllSuccess(task1, task2)

        allTask.addOnSuccessListener {

            for (querySnapshot in it) {
                for (documentSnapshot in querySnapshot) {
                    /** Do your code to get the data */
                }
            }
            
        }.await()
        
        allTask.addOnFailureListener {
            eMsg = it.message.toString()                
        }
        /** Emitting flow based on task status **/

        if (allTask.isSuccessful) {
            emit(State.success(WhatEverItIs))
        } else {
            emit(State.failed(eMsg))
        }

    }
}.catch {
    emit(State.failed(it.message.toString()))
}.flowOn(Dispatchers.IO)