У меня в приложении есть сбор заказов и сбор товаров. Пользователь может иметь несколько продуктов в одном заказе. Что я хочу сделать, так это подсчитать количество каждого продукта, считываемого с помощью коллекции продуктов, а затем выполнить дальнейшие действия. Ниже то, что я получил на данный момент.

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

});

Но здесь я не могу выполнить синхронную задачу, так что я могу сохранить фактическую сумму продукта по его заказу и вычислить общую сумму для хранения в документе.

Может ли кто-нибудь сказать мне, как я достигаю вышеупомянутых сценариев? Как я могу работать вместе с promise, а затем с callback?

0
Guruprasad Rao 2 Янв 2018 в 21:17

2 ответа

Лучший ответ

Вы можете сопоставить массив продуктов с обещаниями, например:

var productPromises = products.map(product => {
    return new Promise((resolve, reject) => {
        firebaseOperation()...onSnapshot(resolve)
    })
})
Promise.all(productPromises).then(results => {
    // process all results at once
})
1
posit labs 2 Янв 2018 в 18:31

Во-первых, не используйте onSnapshot () с облачными функциями. Это прикрепляет слушателя, который будет слушать бесконечно, пока вы его не удалите. Это совсем не то, что вам нужно, потому что функции не могут выполняться бесконечно.

Вместо этого используйте get (), который возвращает обещание, когда выборка завершена.

Кроме того, вы можете собрать все документы, к которым вы хотите получить доступ, в массив и использовать getAll () (с оператором распространения в массиве), чтобы получить их все.

1
Doug Stevenson 2 Янв 2018 в 18:34