【问题标题】:Firestore cloud function asynchronous execution with promise带有承诺的 Firestore 云函数异步执行
【发布时间】:2018-01-03 02:34:42
【问题描述】:

我的应用程序中有订单收集和产品收集。用户可以在其单个订单中拥有多个产品。我想要做的是计算通过产品集合读取的每个产品的数量,然后执行进一步的操作。以下是我目前得到的。

exports.myfunc = functions.firestore.document('collection/{collid}')
    .onCreate(event => {
        let data = event.data.data();
        const products = data.products;
        const prices = [];
        _.each(products, (data1, index) => {
            const weight = data1.weight;
            const isLess = data1.isLess;
            firebaseAdmin.firestore().collection('collection').doc(data1.productId).onSnapshot(data2 => {
                let amount = weight === '1/2' ? data2.data().price1 : data2.data().price1 * weight;
                amount += isLess ? 50 : 0;
                prices.push(amount);
            });
        });
        //Do some task after _.each with new total

});

但我无法在此处实现同步任务,因此我可以根据订单存储产品的实际金额并计算总金额以存储在文档中。

谁能告诉我我是如何实现上述场景的?我如何与promisecallback 一起工作?

【问题讨论】:

    标签: node.js firebase google-cloud-firestore angular5


    【解决方案1】:

    您可以将 products 数组映射到 promise,如下所示:

    var productPromises = products.map(product => {
        return new Promise((resolve, reject) => {
            firebaseOperation()...onSnapshot(resolve)
        })
    })
    Promise.all(productPromises).then(results => {
        // process all results at once
    })
    

    【讨论】:

      【解决方案2】:

      首先,不要将 onSnapshot() 与 Cloud Functions 一起使用。这会附加一个无限期地继续收听的听众,直到您将其删除。这根本不是你想要的,因为函数不能无限期地执行。

      改为使用get(),它会在提取完成时返回一个承诺。

      另外,您可以考虑将要访问的所有文档累积到一个数组中,然后使用getAll()(在数组上使用扩展运算符)来获取它们。

      【讨论】:

        猜你喜欢
        • 2021-01-22
        • 2021-07-16
        • 2017-07-18
        • 2018-08-10
        • 1970-01-01
        • 2022-01-26
        • 2018-09-07
        • 1970-01-01
        相关资源
        最近更新 更多