Android и Firebase Firestore: дождитесь завершения вложенных задач - PullRequest
0 голосов
/ 29 января 2020

Я думаю, что это простая проблема, у меня есть 3 основных коллекции: collection_A, collection_B и collection_ C. Проблема в том, что мне нужен документ "A" из collection_A. Документ «A» содержит атрибут массива «collection_B_uids», после получения документа «A» мне нужно получить каждый документ collection_B, который находится в collection_B_uids, поэтому я сделал это:

public Task foo() {
    return FirebaseFirestore.getInstance().collection("collection_A").document("A").get()
        .addOnSuccessListener(docA -> {
            List<String> collection_B_uids = docA.get("collection_B_uids");
            // ...
            for (String uid : collection_B_uids) {
                FirebaseFirestore.getInstance().collection("collection_B").document(uid).get()
                    .addOnSuccessListener(docB -> {
                        // ...
                    });
            }
        });
}

Работает нормально, но затем мне нужно получить доступ к некоторым документам collection_ C с помощью другого атрибута массива в каждом документе collection_B. Я хочу использовать возврат foo следующим образом:

foo().addOnSuccessListener(...)

И этот окончательный addOnSuccessListener должен быть выполнен после того, как все вложенные задачи будут выполнены. Я уже использую Tasks.whenAllSuccess внутри основной Задачи, но это не сработало.

Мои предположения:

a) создайте рекурсивную функцию, используя одновременно 2 слушателя;

b) используйте continueWithTask или continueWith (предпочтительно);

c) создайте глобальный AsyncTask, затем используйте Tasks.await (пожалуйста, не надо).

Ps: я не английский sh родной

...