第一个条件为真后退出for循环

时间:2017-11-28 10:37:15

标签: javascript firebase firebase-realtime-database

我有一个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'});
    })
});

2 个答案:

答案 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并且它非常完美。