Как цепные запросы в firestore и wait получают данные - PullRequest
2 голосов
/ 10 июля 2019

Я бы хотел объединить запрос в firestore.Мне нужна некоторая информация об одной коллекции, прежде чем я получу другую информацию в другой коллекции.

Я уже пытался использовать Tasks.whenall() ... но неэффективно.Я тоже пытаюсь использовать callBack.

Вот моя первая функция:

public static void getAllFavoris(){
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    FirebaseFirestore.getInstance().collection("product").document("favoris").collection(uid).get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {//task is succesful
                        Log.e("TAG","task succes for fav ");
                        for (QueryDocumentSnapshot document : task.getResult()){//never enter in this loop
                            Log.e("TAG","Doc "+document);
                            Log.e("TAG", "Succes for get all favoris");
                            Log.e("TAG","data for favoris ::: "+document.getId());
                            MainActivity.favorisList.add(document.getId());
                        }
                    }
                    else {
                        Log.d("TAG", "Error getting documents: ", task.getException());
                    }
//call without data retrieve
                    Log.e("TAG","favoris ::: "+showListContentS(MainActivity.favorisList));
                    getProductByTagFound();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.e("TAG","error get All favoris"+e);
                }
            });
}

А вот второй запрос, который мне нужен:

public static void getProductByTagFound(){
for(int i=0;i<MainActivity.allTags.size();i++){ //allTags is not empty and i need to finish this loop
    String tagId = MainActivity.allTags.get(i).toString();
    FirebaseFirestore.getInstance().collection("product").document("allProduct").collection("productByTag").document(tagId).get()
            .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()){
                            Log.e("TAG", "Succes for get productByTag");
                            Product pdt = task.getResult().toObject(Product.class);
                            MainActivity.productByTag.add(pdt);

                    }
                }
            });
}
//this must be call after the loop is finish but call in the same time.
Log.e("TAG","Get product BY Tag"+showListContentP(MainActivity.productByTag));
createFinalList();

}

Мне нужно позвонить createFinalList() после окончания цикла, а также войти в цикл для получения данных favis и вызвать getProductByTag() после.

1 Ответ

1 голос
/ 10 июля 2019

Если вы хотите выполнить новый запрос сразу после завершения первого, вам нужно подождать, пока первый запрос не завершится. Чтобы справиться с этим, вам нужно использовать вложенные запросы. Другими словами, вам нужно переместить второй запрос прямо внутрь первого обратного вызова, внутри метода onComplete(). Таким образом, второй запрос будет выполнен только после завершения первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...