【问题标题】:Firestore Javascript nested foreach queries looping before the second queryFirestore Javascript嵌套的foreach查询在第二个查询之前循环
【发布时间】:2020-06-24 03:04:32
【问题描述】:

我正在尝试获取地点的文档 ID,并查看在我的“用户”集合的子集合之一中引用的评论。得到它后,我执行另一个查询,然后使用这些 ID 来获取另一个集合“地方”中的评论字段的实际值

    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 中的一个值实际上为 null,另一个为 TEsting/n) 但记录的 ID 仅来自第一个查询的最后一个输出。我该如何解决这个问题?

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    您所观察到的正是我所期望的。由于get() 是异步的并返回一个promise,它总是会在查询结果可用之前立即返回。如果你将一堆对get() 的调用放在一个循环中,那么循环将始终在异步工作的任何结果完成之前完成。

    如果你想等到一堆promise被解决,你应该将它们收集到一个数组中,并使用Promise.all()创建另一个promise,当它们都完成时解决。

    另见:

    【讨论】:

    • 感谢您的回答。我现在理解了 Promise 的概念,但我似乎无法理解我应该如何将它应用于我当前的代码。你介意是否可以提示我应该做什么
    • 我链接的其他问题有具体的例子。
    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2015-10-09
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多