火力地堡云功能触发两次的onUpdate
问题描述:
下面我有我的firebase collection - payments
火力地堡云功能触发两次的onUpdate
"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
级别使用任何标志。有人能指导我在这个方向上正确吗?
编辑
注 - 我已经为进入付款细节的编辑选项。
答
如果你想只有当你加你可以直接在支付细节使用的onCreate触发付款明细更新余额。
尝试类似的东西(你需要更新你的情况下,代码):
exports.calculateBalance = functions.database.ref('payments/{pushId}/paymentDetails/{detailId}').onCreate(event => {
var paymentRef = event.data.adminRef.parent.parent;
var paymentDetailSnapshot = event.data;
var paymentDetailAmountSnapshot = paymentDetailSnapshot.child('amount');
return paymentRef.child('balanceAmount').transaction(current => {
return current - paymentDetailAmountSnapshot.val(); // Balance can be negative
});
});
(使用事务管理并发修改)
注意
请直接使用编号为您量数据不是字符串。
UPDATE
添加此功能以管理更新:
exports.recalculateBalance = functions.database.ref('payments/{pushId}/paymentDetails/{detailId}').onUpdate(event => {
var paymentRef = event.data.adminRef.parent.parent;
var paymentDetailSnapshot = event.data;
var previousPaymentDetailSnapshot = event.data.previous;
var paymentDetailAmountSnapshot = paymentDetailSnapshot.child('amount');
var previousPaymentDetailAmountSnapshot = previousPaymentDetailSnapshot.child('amount');
return paymentRef.child('balanceAmount').transaction(current => {
return current + previousPaymentDetailAmountSnapshot.val() - paymentDetailAmountSnapshot.val(); // Balance can be negative
});
});
你可以可以'off'删除该节点上的监听器,然后调用'on'再次设置监听器(我不是一个好的网页开发人员,但我在android上使用这种方法) –
你可以更新付款明细或只是创建它? – Pipiks