Firestore Javascript вложенных запросов foreach зацикливание перед вторым запросом - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь получить идентификатор документа для мест и просмотреть, на который ссылается один из подколлекций в моей коллекции "пользователей". Получив его, я выполняю другой запрос, чтобы затем использовать эти идентификаторы, чтобы получить фактическое значение поля обзора, которое находится в другой коллекции «местами»

    var query = db.collection('users/ziRsQGzbuwVp805SYY9vkZIbbJ93/myRecommendations');
        query.get().then(function(querySnapshot){
        querySnapshot.forEach(function(doc){
            locData.placeID = doc.data().placesDocument;
            locData.reviewID = doc.data().reviewDocument;
            var query2 = db.collection('places').doc(locData.placeID).collection('reviews').doc(locData.reviewID)
            query2.get().then(function(doc){
                locData.review = doc.data().specRemarks         
                locdataArr.push(parse)
                console.log(locdataArr)

, однако, foreach из первого запроса

        querySnapshot.forEach(function(doc){
            locData.placeID = doc.data().placesDocument;
            locData.reviewID = doc.data().reviewDocument;
            var query2 = db.collection('places').doc(locData.placeID).collection('reviews').doc(locData.reviewID)
            query2.get().then(function(doc){
                locData.review = doc.data().specRemarks

кажется l oop перед выполнением второго запроса, который приводит к тому, что только последний вывод из первого запроса проходит через второй с этими выводами из журнала

enter image description here

проверка была успешной (одно значение фактически равнялось нулю в пожарном депо, а другое было TEsting / n), но записанные идентификаторы были только из последнего вывода первого запроса. Как мне это исправить?

1 Ответ

0 голосов
/ 12 марта 2020

То, что вы наблюдаете, - это то, чего я ожидал. Поскольку get() является асинхронным и возвращает обещание, оно всегда будет возвращаться немедленно, до того, как станут доступны результаты запроса. Если вы поместите несколько вызовов на get() в al oop, l oop всегда завершится до завершения любого из результатов асинхронной работы c.

Если вы хотите подождите, пока куча обещаний не будет решена, вы должны собрать их в массив и использовать Promise.all(), чтобы создать другое обещание, которое разрешится, когда все они будут выполнены.

См. также:

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