我有一个Firebase函数,它触发onWrite到特定引用数据库,而不是我拍摄另一个引用的快照,如果刚刚添加的值的大小等于快照的大小我将1减少到快照并再次更新它。但是如果我有多个大小和数量,循环继续并删除所有内容。如何在满足第一个条件后退出循环。这是我的代码:
exports.finalizeOrder = functions.database.ref('/orders/{pushId}')
.onWrite(event => {
var orderData = event.data.val();
return admin.database().ref('models/').child('females').child(orderData.id).once('value', function(data){
var dbModel = data.val();
for(var s = 0;s<dbModel.sizes.length;s++){
if(Number(orderData.size) === dbModel.sizes[s].size){
var index = dbModel.sizes.indexOf(dbModel.sizes[s])
if(dbModel.sizes[s].amount > 0){
dbModel.amount = dbModel.amount - 1;
dbModel.sizes[s].amount = dbModel.sizes[s].amount -1;
if(dbModel.sizes[s].amount === 0){
dbModel.sizes.splice(index, 1)
}
}
}
}
admin.database().ref('models/').child('females').child(orderData.id).update(dbModel);
admin.database().ref('orders').child(event.data.key).update({status: 'proccesing'});
})
});
答案 0 :(得分:0)
您可以使用布尔标志并在for循环的条件语句中进行检查。并在满足条件时将其设置为false。在下面的示例中,我将其添加到第一个if
内。您可以在满足条件时在for循环内的任何位置设置它。
exports.finalizeOrder = functions.database.ref('/orders/{pushId}')
.onWrite(event => {
var orderData = event.data.val();
return admin.database().ref('models/').child('females').child(orderData.id).once('value', function(data){
var dbModel = data.val();
var conditionFlag = true; // Set condition flag to be true
for(var s = 0;s<dbModel.sizes.length && conditionFlag ;s++){
if(Number(orderData.size) === dbModel.sizes[s].size){
conditionFlag = false; // Set conditionFlag to false wherever you want inside the loop so that the loop stops
var index = dbModel.sizes.indexOf(dbModel.sizes[s])
if(dbModel.sizes[s].amount > 0){
dbModel.amount = dbModel.amount - 1;
dbModel.sizes[s].amount = dbModel.sizes[s].amount -1;
if(dbModel.sizes[s].amount === 0){
dbModel.sizes.splice(index, 1)
}
}
}
}
admin.database().ref('models/').child('females').child(orderData.id).update(dbModel);
admin.database().ref('orders').child(event.data.key).update({status: 'proccesing'});
})
});
答案 1 :(得分:0)
所以这里的问题是我正在监听onWrite到我指定的数据库ref,这是第一次我推送数据时发生的,第二次我更新它就是为什么它执行该函数两次。我改变了onWrite使用onCreate并且它非常完美。