Firestore Javascript嵌套的foreach查询在第二个查询之前循环

Firestore Javascript嵌套的foreach查询在第二个查询之前循环,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我正在尝试获取我的“用户”集合中某个子集合上引用的地点和审阅的文档ID。在得到它之后,我执行另一个查询,然后使用这些ID获取另一个集合“places”中的review字段的实际值 var query = db.collection('users/ziRsQGzbuwVp805SYY9vkZIbbJ93/myRecommendations'); query.get().then(function(querySnapshot){ querySnapshot.f

我正在尝试获取我的“用户”集合中某个子集合上引用的地点和审阅的文档ID。在得到它之后,我执行另一个查询,然后使用这些ID获取另一个集合“places”中的review字段的实际值

    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
似乎在执行第二个查询之前循环,这只会导致第一个查询的最后一个输出与日志中的这些输出一起通过第二个查询

审查成功(firestore中的一个值实际上为空,另一个值正在测试/n)
但记录的ID仅来自第一个查询的最后一个输出。我该如何解决这个问题?

您所观察到的是我所期望的。由于
get()
是异步的并返回承诺,因此它总是在查询结果可用之前立即返回。如果将对
get()
的一系列调用放在一个循环中,那么该循环总是在异步工作的任何结果完成之前完成

如果要等待一组承诺得到解决,则应将它们收集到一个数组中,并使用
Promise.all()
创建另一个承诺,在所有承诺都完成时进行解决

另见:


谢谢你的回答。我现在理解了承诺的概念,但我似乎不知道应该如何将其应用到我当前的代码中。你介意给我一些建议吗?我想问的其他问题都有具体的例子。