【问题标题】:Firestore async function for array of document ids文档 ID 数组的 Firestore 异步函数
【发布时间】:2020-08-25 13:51:43
【问题描述】:

我有一组 Firestore 文档 IDS。我需要将下面的代码转换为异步/等待。我通常对一个文档使用 async/await,但现在我需要 for 循环。最后一个 console.log(firestoreProducts) 是空的。

function getFirestoreProducts(allSKUsNoDuplicates) {
    //allSKUsNoDuplicates - array of document ids
        let db = firebase.firestore();
        var db_user = db.collection("users").doc(firebase.auth().currentUser.email);
        var products = db_user.collection("products");
        var firestoreProducts = []


        //var products = db_user.collection("products").where("productSKU", "in", allSKUsNoDuplicates).orderBy("productSKU", "asc");// ups only 10 can be in array
        allSKUsNoDuplicates.forEach(function (currentValue, index) {
            //console.log(currentValue)
            products.doc(currentValue)
                .get()
                .then(function (doc) {
                    if (doc.exists) {
                        //console.log("Document data:", doc.data().productSKU);
                        firestoreData = {

                            productSKU: doc.data().productSKU,
                            productBuyPriceNet: (doc.data().productBuyPriceNet) ? doc.data().productBuyPriceNet : 0

                        }
                        firestoreProducts.push(firestoreData);


                    } else {
                        // doc.data() will be undefined in this case
                        console.log("No such document!");
                    }
                }).catch(function (error) {
                    console.log("Error getting document:", error);
                });

        })

        console.log(firestoreProducts)

    }

【问题讨论】:

标签: javascript google-cloud-firestore async-await


【解决方案1】:

您所能做的就是获取 Promise 列表,Promise.all() 非常适合。它在所有承诺完成后完成,并为您提供结果列表。如 cmets 中所述,进一步解释 here

在您的具体情况下,应该这样做:

async function getFirestoreProducts(allSKUsNoDuplicates) {
    //allSKUsNoDuplicates - array of document ids
        let db = firebase.firestore();
        var db_user = db.collection("users").doc(firebase.auth().currentUser.email);
        var products = db_user.collection("products");
        var firestoreProductPromises = []


        //var products = db_user.collection("products").where("productSKU", "in", allSKUsNoDuplicates).orderBy("productSKU", "asc");// ups only 10 can be in array
        allSKUsNoDuplicates.forEach(function (currentValue, index) {
            //console.log(currentValue)
            firestoreProductPromises.push(
                products.doc(currentValue)
                    .get()
                    .then(function (doc) {
                        if (doc.exists) {
                            //console.log("Document data:", doc.data().productSKU);
                            firestoreData = {

                                productSKU: doc.data().productSKU,
                                productBuyPriceNet: (doc.data().productBuyPriceNet) ? doc.data().productBuyPriceNet : 0

                            }


                        } else {
                            // doc.data() will be undefined in this case
                            console.log("No such document!");
                        }
                    }).catch(function (error) {
                        console.log("Error getting document:", error);
                    }));

        });

        var firestoreProducts = await Promise.all(firestoreProductPromises);

        console.log(firestoreProducts)

    }

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 2021-10-22
    • 2021-05-31
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多