【发布时间】:2018-01-08 03:30:50
【问题描述】:
我为firebase collection - payments 设置了以下规则
"payments": {
"$paymentId": {
"totalAmount": {
},
"balanceAmount": {
".validate": "newData.val()<=data.child('totalAmount').val()"
},
"paymentDetails": {
"$detailId": {
"amount": {
".validate": "newData.isString()"
},
}
},
}
}
以及以下为处理该集合的某些更新而编写的云函数:
exports.calculateBalance = functions.database
.ref('payments/{pushId}')
.onUpdate(event => {
const paymentRef = event.data.adminRef;
const payment = event.data.val();
return paymentRef.once('value').then(snapshot => {
var paidAmount = 0;
snapshot.child("paymentDetails").forEach(function(child) {
paidAmount += parseFloat(child.child("amount").val());
});
return paidAmount;
}).then(snap => {
payment.balanceAmount = parseFloat(payment.totalAmount) - snap;
return paymentRef.set(payment);
})
});
很简单,每当我添加付款详细信息时,我都想更新balanceAmount。这里的问题是,每当该集合发生更新时,该函数都会触发两次。第一次从应用程序中显而易见,第二次因为paymentRef.set(payment); 行。
有什么方法可以避免第二次触发云功能吗?我不能在collection 级别上使用任何标志,因为付款详细信息的更新发生了多次。有人可以指导我正确的方向吗?
编辑
注意 - 我有一个输入付款详细信息的编辑选项。
【问题讨论】:
-
您可以
off删除该节点上的侦听器,然后调用on再次设置侦听器(我不是一个优秀的Web 开发人员,但我在android 上使用这种方法) -
您可以更新付款明细还是直接创建?
标签: android firebase firebase-realtime-database google-cloud-functions