Firestore云函数具有承诺的异步执行

问题描述 投票:0回答:2

我在我的申请中有订单收集和产品收集。用户可以在单个订单中拥有多个产品。我想要做的是通过产品集合计算每个产品的数量,然后执行进一步的操作。以下是我现在的情况。

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
2个回答
1
投票

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

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

1
投票

首先,不要将onSnapshot()与云函数一起使用。这会使一个倾听者无限期地倾听,直到你将其删除。这根本不是你想要的,因为函数不能无限期地执行。

相反,使用get(),它在获取完成时返回一个promise。

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

© www.soinside.com 2019 - 2024. All rights reserved.