У меня в приложении есть сбор заказов и сбор товаров. Пользователь может иметь несколько продуктов в одном заказе. Что я хочу сделать, так это подсчитать количество каждого продукта, считываемого с помощью коллекции продуктов, а затем выполнить дальнейшие действия. Ниже то, что я получил на данный момент.
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
?
2 ответа
Вы можете сопоставить массив продуктов с обещаниями, например:
var productPromises = products.map(product => {
return new Promise((resolve, reject) => {
firebaseOperation()...onSnapshot(resolve)
})
})
Promise.all(productPromises).then(results => {
// process all results at once
})
Во-первых, не используйте onSnapshot () с облачными функциями. Это прикрепляет слушателя, который будет слушать бесконечно, пока вы его не удалите. Это совсем не то, что вам нужно, потому что функции не могут выполняться бесконечно.
Вместо этого используйте get (), который возвращает обещание, когда выборка завершена.
Кроме того, вы можете собрать все документы, к которым вы хотите получить доступ, в массив и использовать getAll () (с оператором распространения в массиве), чтобы получить их все.
Похожие вопросы
Новые вопросы
node.js
Node.js - это неблокирующая асинхронная среда ввода-вывода, основанная на событиях, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на клиенте, так и на стороне сервера, и, следовательно, выигрывают от повторного использования кода и отсутствия переключения контекста.