具有承诺的 Firestore 云函数异步执行
Firestore cloud function asynchronous execution with promise
我的应用程序中有订单集合和产品集合。用户可以在他们的单个订单中拥有多个产品。我想做的是通过产品集合计算每个产品的阅读量,然后执行进一步的操作。以下是我目前得到的。
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
?
您可以将产品数组映射到承诺,如下所示:
var productPromises = products.map(product => {
return new Promise((resolve, reject) => {
firebaseOperation()...onSnapshot(resolve)
})
})
Promise.all(productPromises).then(results => {
// process all results at once
})
首先,不要将 onSnapshot() 与 Cloud Functions 一起使用。这附加了一个无限期地保持监听的监听器,直到您将其删除。那根本不是你想要的,因为函数不能无限期地执行。
相反,使用 get(),returns 获取完成时的承诺。
此外,您可以考虑将要访问的所有文档累积到一个数组中,然后使用 getAll()(在数组上使用扩展运算符)来获取所有文档。
我的应用程序中有订单集合和产品集合。用户可以在他们的单个订单中拥有多个产品。我想做的是通过产品集合计算每个产品的阅读量,然后执行进一步的操作。以下是我目前得到的。
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
?
您可以将产品数组映射到承诺,如下所示:
var productPromises = products.map(product => {
return new Promise((resolve, reject) => {
firebaseOperation()...onSnapshot(resolve)
})
})
Promise.all(productPromises).then(results => {
// process all results at once
})
首先,不要将 onSnapshot() 与 Cloud Functions 一起使用。这附加了一个无限期地保持监听的监听器,直到您将其删除。那根本不是你想要的,因为函数不能无限期地执行。
相反,使用 get(),returns 获取完成时的承诺。
此外,您可以考虑将要访问的所有文档累积到一个数组中,然后使用 getAll()(在数组上使用扩展运算符)来获取所有文档。